## 單例模式
英文名稱:(Singleton Pattern)
**定義**:確保某一個類只用一個實例,而且自行實例化并向整個系統提供這個實例
UML圖:

~~~
public class SingletonTest {
public static void main(String[] args) {
//通過Singleton對外暴漏的方法,進行實例化。并保證只有一個實例
Singleton single = Singleton.getInstance();
System.out.println(single.toString());
}
}
//又稱餓漢式單例模式
class Singleton{
private static final Singleton single = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return single;
}
}
//又稱懶漢式單例模式
//<span style="font-size:18px;">懶漢式單例模式在遇到高并發情況,系統有壓力增大,可能會出現多個實例的對象。</span>
class Singleton1{
private static Singleton1 single = null;
private Singleton1(){
}
public static Singleton1 getInstance(){
if(single==null){
synchronized (Singleton1.class) { //
if(single==null){
single = new Singleton1();
}
}
}
return single;
}
}
~~~
**(按照書本上的總結,自己理解并不太深刻。。)**
**單例模式的優點:**
1、單例模式內存中只有一個實例,減少內存開支,一個對象需要頻繁的創建和銷毀。使用單例模式具有很大的優勢。
2、單例只生成一個實例,減少系統的性能開銷。
3、單例模式可以在避免對資源的多重占用。
4、單例模式可以在系統設置全局的訪問點,優化和共享資源訪問。
**單例模式的缺點:**
1、單例模式一般沒有接口,擴展很困難。
2、單例對測試不利
3、單例與單一職責原則有沖突。
**單例的使用場景:**
1、要求生成唯一序列號的環境
2、在整個項目中需要一個共享訪問點或訪問數據
3、創建一個對象需要消耗的資源過多
4、需要定義大量的靜態常量和靜態方法。
**單例的拓展**
通過單例的拓展,讓類只產生兩個或者多個實例對象。
UML圖

~~~
public class EmperorTest {
public static void main(String[] args) {
for(int i=0;i<5;i++){
//獲取Emperor對象的實例
Emperor e = Emperor.getEmperor();
e.say();
}
}
}
class Emperor{
//定義一個list集合,用來存放對象的實例
private static List<Emperor> listEmperor = new ArrayList<Emperor>();
private static int maxNum = 2;
//定義一個list集合,為創建的對象設置編號。
private static List<String> listNumofEmperor = new ArrayList<String>();
//表示當前編號
private static int currentNum = 0;
//創建出所有的對象
static{
for(int i=0;i<maxNum;i++)
listEmperor.add(new Emperor("實例化.."+(i+1)+"..對象"));
}
private Emperor(String name){
listNumofEmperor.add(name);
}
public static Emperor getEmperor(){
Random random = new Random();
currentNum = random.nextInt(maxNum);
return listEmperor.get(currentNum);
}
public void say(){
System.out.println(listNumofEmperor.get(currentNum));
}
}
~~~
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式