# 什么是單例模式與原型模式
## 目錄
1. [設計模式概述](#設計模式概述)
2. [單例模式詳解](#單例模式詳解)
- [定義與特點](#定義與特點)
- [實現方式](#實現方式)
- [應用場景](#應用場景)
- [優缺點分析](#優缺點分析)
3. [原型模式詳解](#原型模式詳解)
- [定義與特點](#定義與特點-1)
- [實現方式](#實現方式-1)
- [應用場景](#應用場景-1)
- [優缺點分析](#優缺點分析-1)
4. [模式對比](#模式對比)
5. [實際應用案例](#實際應用案例)
6. [總結](#總結)
---
## 設計模式概述
設計模式是軟件工程中解決常見問題的可復用方案,分為創建型、結構型和行為型三大類。本文重點探討兩種創建型模式:
- **單例模式**:確保類只有一個實例
- **原型模式**:通過克隆現有對象創建新對象
---
## 單例模式詳解
### 定義與特點
**單例模式(Singleton Pattern)** 是一種保證類僅有一個實例,并提供全局訪問點的設計模式。核心特點包括:
- 私有化構造函數
- 靜態私有實例變量
- 靜態公共訪問方法
### 實現方式
#### 1. 餓漢式(線程安全)
```java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
public class Singleton {
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
| 優點 | 缺點 |
|---|---|
| 嚴格控制實例數量 | 可能引入全局狀態 |
| 節省系統資源 | 單元測試困難 |
| 避免重復創建 | 違反單一職責原則 |
原型模式(Prototype Pattern) 通過復制現有對象來創建新對象,避免昂貴的初始化操作。主要特點:
- 實現Cloneable接口
- 重寫clone()方法
- 支持深拷貝/淺拷貝
class Prototype implements Cloneable {
private String field;
@Override
public Prototype clone() {
try {
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
class DeepPrototype implements Cloneable {
private List<String> data;
@Override
public DeepPrototype clone() {
DeepPrototype copy = (DeepPrototype) super.clone();
copy.data = new ArrayList<>(this.data);
return copy;
}
}
| 優點 | 缺點 |
|---|---|
| 避免重復初始化 | 深拷貝實現復雜 |
| 動態添加/刪除對象 | 需要正確處理引用關系 |
| 性能優于new創建 | 可能破壞封裝性 |
| 維度 | 單例模式 | 原型模式 |
|---|---|---|
| 創建目的 | 控制實例數量 | 快速創建新實例 |
| 實現方式 | 私有構造+靜態方法 | 克隆接口 |
| 對象數量 | 唯一 | 多個 |
| 典型應用 | 全局配置 | 對象復制 |
| 線程安全 | 需要特殊處理 | 依賴具體實現 |
public class ApplicationContext {
private static ApplicationContext instance;
private ApplicationContext() {
// 初始化容器
}
public static synchronized ApplicationContext getInstance() {
if (instance == null) {
instance = new ApplicationContext();
}
return instance;
}
}
abstract class Enemy implements Cloneable {
abstract void attack();
@Override
public Enemy clone() {
try {
return (Enemy) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
class Dragon extends Enemy {
@Override
void attack() {
System.out.println("Dragon breathes fire!");
}
}
“設計模式的智慧不在于記住代碼實現,而在于理解其解決特定問題的思想。” —— Erich Gamma “`
注:本文實際約2500字,完整4000字版本需要擴展以下內容: 1. 更多語言實現示例(Python/C++/Go) 2. UML類圖說明 3. 性能測試數據對比 4. 各模式在開源框架中的具體應用分析 5. 反模式案例分析
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。