Java面向對象之單例設計模式詳解
一、什么是設計模式
1.靜態(tài)方法和屬性的經典使用
2.設計模式是在大量的實踐中總結和理論化之后優(yōu)選的代碼結構、編程風格、以及解決問題的思考方式。設計模式就像是經典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己再思考和摸索。
二、什么是單例模式(單個的實例)
1.所謂類的單例設計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法
2.單例模式有兩種:①餓漢式 ②懶漢式
步驟:
1.構造器私有化
2.類的內部創(chuàng)建對象
3.向外暴露一個靜態(tài)的公共方法
三、餓漢式和懶漢式區(qū)別
1.兩者最主要的區(qū)別在于創(chuàng)建對象的時機不同,餓漢式是在類加載時就創(chuàng)建了對象實例,而懶漢式是在使用時才會創(chuàng)建
2.餓漢式不存在線程安全問題,而懶漢式存在線程安全問題(后面學習線程會補充)
3.餓漢式存在浪費資源的可能。如果一個程序員一個對象實例都沒有去使用,那么餓漢式創(chuàng)建的對象實例就浪費了;懶漢式是使用時才會創(chuàng)建,所以不存在這個問題
4.在javaSE標準類中, java.lang.Runtime就是經典的單例模式
餓漢式案例
package com.learn.single_;
import java.util.GregorianCalendar;
/**
* 演示餓漢式的單例模式
*/
public class SingleTon01 {
public static void main(String[] args) {
//GirlFriend xh = new GirlFriend("小紅");
//GirlFriend xb = new GirlFriend("小白");
//通過方法可以獲取對象
GirlFriend instance1 = GirlFriend.getInstance();
System.out.println(instance1);
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2);
System.out.println(instance1 == instance2);//同一個對象
}
}
//有一個類,GirlFriend
//只能有一個女朋友
class GirlFriend {
private String name;
//為了能夠在靜態(tài)方法中返回gf對象,需要將其修飾為static
private static GirlFriend gf = new GirlFriend("小紅紅");
//如何保障我們只能創(chuàng)建一個GirlFriend對象
//步驟[單例模式—餓漢式]
//1.將構造器私有化(防止在類的外部直接創(chuàng)建對象)
//2.在類的內部直接創(chuàng)建對象(該對象是static)
//3.為了使用,提供一個公共的static方法,返回gf對象
private GirlFriend(String name) {
this.name = name;
}
public static GirlFriend getInstance(){
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}懶漢式案例
package com.learn.single_;
/**
* 演示懶漢式的單例模式
*/
public class SingleTon02 {
public static void main(String[] args) {
//new Cat("大黃");
//調用一個靜態(tài)屬性會讓類加載,但是靜態(tài)變量屬性并沒有創(chuàng)建對象,所以并不會調用構造器
System.out.println(Cat.n1);
Cat instance1 = Cat.getInstance();
System.out.println(instance1);
//第二次去調getInstance時cat已經不為空,不會再創(chuàng)建新的對象,會把上一次創(chuàng)建的對象返回
Cat instance2 = Cat.getInstance();
System.out.println(instance2);
System.out.println(instance1 == instance2); //T
}
}
//希望在程序運行中,只能創(chuàng)建一個cat對象
//使用單例模式
class Cat{
private String name;
public static int n1 = 999;
public static Cat cat; //默認為null
//步驟
//1.仍然將構造器私有化
//2.定義一個static靜態(tài)變量屬性
//3.提供一個public的static方法,可以返回一個cat對象
//4.懶漢式,只有當用戶使用getInstance時才返回一個cat對象,后面再次調用時會返回上一次創(chuàng)建的cat對象
// 從而保證單例
private Cat(String name) {
System.out.println("構造器被調用...");
this.name = name;
}
public static Cat getInstance(){
if(cat == null){ //如果還沒有創(chuàng)建cat對象
cat = new Cat("小可");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}到此這篇關于Java面向對象之單例設計模式詳解的文章就介紹到這了,更多相關Java單例設計模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringCloud添加客戶端Eureka Client過程解析
這篇文章主要介紹了SpringCloud添加客戶端Eureka Client過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03
在Idea2020.1中使用gitee2020.1.0創(chuàng)建第一個代碼庫的實現(xiàn)
這篇文章主要介紹了在Idea2020.1中使用gitee2020.1.0創(chuàng)建第一個代碼庫的實現(xiàn),文中通過圖文示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
解決IDEA使用Spring Initializr創(chuàng)建項目時無法連接到https://start.spring.io的問
這篇文章主要介紹了解決IDEA使用Spring Initializr創(chuàng)建項目時無法連接到https://start.spring.io的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
SpringCloud使用spring-boot-devtools 進行熱部署的實現(xiàn)
本文主要介紹了Spring Cloud使用spring-boot-devtools進行熱部署,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-10-10
SpringBoot整合MyBatis-Flex的保姆級教程
MyBatis-Flex 是一個基于 MyBatis 的增強框架,它提供了比傳統(tǒng) MyBatis Plus 更加強大和靈活的功能特性,下面我們就來看看如何在SpringBoot中整合MyBatis-Flex吧2026-01-01

