# 單例模式
[TOC]
## 什么是設計模式
>[info] 設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發人員所采用。設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的。
> **設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結**。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項目中合理地運用設計模式可以完美地解決很多問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案。
**通俗解釋就是:**
>[info] 設計模式類似于我們做數學應用題時,針對不同的題型,總結出來的不同的解題套路。靈活的運用了不同的公式(就是我們學習到的Java知識點),給這些應用題制定了規范而又簡單的解題方法
## 設計模式的使用
設計模式在軟件開發中的兩個主要用途。
**開發人員的共同平臺**
設計模式提供了一個標準的術語系統,且具體到特定的情景。例如,單例設計模式意味著使用單個對象,這樣所有熟悉單例設計模式的開發人員都能使用單個對象,并且可以通過這種方式告訴對方,程序使用的是單例模式。
**最佳的實踐**
設計模式已經經歷了很長一段時間的發展,它們提供了軟件開發過程中面臨的一般問題的最佳解決方案。學習這些模式有助于經驗不足的開發人員通過一種簡單快捷的方式來學習軟件設計。
## 23種設計模式
設計模式多種多樣,通常認為23種設計模式是其他設計模式的基礎。
創建型模式:簡化創建對象的過程
結構型模式:在軟件上通過重構,抽象使結構變得更有條理
行為型模式:在現實中具體的業務場景中對某種行為進行的優化
## 單例模式
在實際的開發中,絕大部分的服務性質的類都會設計成單例模式
所謂的單例模式,就是類**只有**(**只產生**)一個對象,外部要使用該類的對象,通過調用一個類方法實現。
比如說,我們打印機連接電腦,無論多少的打印機與電腦相連,實現操作控制的只能是一臺電腦。如果一臺打印機連接兩臺電腦,這兩臺電腦都對打印機作出指示,就會打印出錯。
### 單例模式特點
* 1、單例類只能有一個實例。
* 2、單例類必須自己創建自己的唯一實例。
* 3、單例類必須給所有其他對象提供這一實例。

### 單例模式實現
#### 餓漢式
特點:創建對象實例的時候直接初始化,速度快,占用空間大。-對象已經優先創建好了
~~~
//餓漢式:創建對象實例的時候直接初始化 空間換時間
public class SingletonOne {
//1、創建類中私有構造
private SingletonOne() {
}
//2、創建該類型的私有靜態實例,先實例化,這個餓漢式的特點
private static SingletonOne instance=new SingletonOne();
//3、創建公有靜態方法返回靜態實例對象
public static SingletonOne getInstance() {
return instance;
}
}
~~~
#### 懶漢式
特點:類內實例對象創建時并不直接初始化,直到第一次調用getInstance()方法時,才完成初始化操作,時間長,空間小-只有在用到的時候才會進行對象創建
~~~
public class SingletenTwo {
//1、創建私有構造方法
private SingletenTwo(){};
//2、創建該類型的私有靜態實例
private static SingletonTwo instance=null;
//3、創建公有靜態方法返回靜態實例對象
public static SingletonTwo getInstance(){
if(instance == null) {
instance=new SingletonTwo();
}
return instance;
}
}
~~~
### 餓漢式PK懶漢式
1. 餓漢式在類加載時就實例化對象,空間換時間,在第一次使用此實例的時候加載速度快,但長時間不使用該對象則造成內存空間的浪費。懶漢式在第一次真正使用此類實例的時候才實例化,時間換空間,在第一次使用此類實例的時候加載速度慢,但不會造成內存空間的浪費。
2. 在多線程中,餓漢式線程安全,懶漢式存在線程風險。
### 單例模式的特點及適用場景
優點:

缺點:

使用場景:

## 練習
一、選擇
1. 單例模式的實現必須滿足()個條件(多選)
~~~
A. 類中的構造方法的訪問權限必須設置為私有的
B. 類中的構造方法必須用protected修飾
C. 必須在類中創建該類的靜態私有對象
D. 在類中提供一個公有的靜態方法用于創建、獲取靜態私有對象
~~~
2. 下列關于懶漢式和餓漢式的說法錯誤的是(多選)
~~~
A. 餓漢式在第一次使用時進行實例化
B. 懶漢式在類加載時就創建實例
C. 餓漢式的線程是安全的
D. 懶漢式存在線程風險
~~~
二、編程
1. 某公司研發星球維護系統,請使用餓漢式單例模式的實現思想,設計編寫地球類。
程序運行參考效果圖如下:

~~~
public class Earth {
//定義私有構造方法,并在構造方法中打印輸出“地球誕生”
//定義私有靜態類對象并完成實例化
//定義公有靜態方法返回類內的私有靜態對象
}
~~~