創建型設計模式:對象誕生的藝術與智慧

🎭 創建型設計模式:對象誕生的藝術與智慧

💡 溫馨提示:本文將以輕松有趣的方式帶你探索設計模式的世界,就像在聽一個關于"如何優雅地生孩子"的故事一樣!

🚪 傳送門:在開始我們的"對象制造之旅"之前,建議先通過這個 🎨 Java設計模式詳解:讓代碼優雅如詩的秘密武器 了解設計模式的基礎概念和整體架構,這樣能讓你更好地理解本文內容!就像玩游戲要先看新手教程一樣!🎮

🏗? 創建型設計模式整體架構

設計原則
創建型設計模式
需要全局唯一
需要動態選擇
需要系列產品
需要復雜構建
需要對象克隆
對擴展開放
對修改關閉
開閉原則
依賴抽象
不依賴具體
依賴倒置原則
一個類只負責
一個職責
單一職責原則
選擇合適模式
對象創建問題
單例模式
工廠方法模式
抽象工廠模式
建造者模式
原型模式
數據庫連接池
配置管理器
日志記錄器
數據庫連接器
日志記錄器
文件處理器
UI組件庫
數據庫訪問層
主題系統
復雜對象構建
參數化構造
鏈式調用
對象克隆
模板復制
原型創建

🎪 引言:為什么我們需要設計模式?

🏭 場景:混亂的代碼工廠 🏭
┌─────────────────────────────────────┐
│  💻 程序員小王的一天 💻              │
│                                     │
│  😵 "new"操作符滿天飛!             │
│  🔥 代碼重復像復制粘貼大賽!         │
│  🐛 Bug多得像夏天的蚊子!           │
│                                     │
│  💡 突然,設計模式英雄出現了!       │
│  🦸?♂? "讓我來拯救你的代碼!"         │
└─────────────────────────────────────┘

創建型設計模式就像是"對象制造"的標準作業流程,讓代碼變得優雅、可維護、可擴展。

本文將帶你探索五種創建型設計模式,就像參觀五個不同的"對象制造車間"一樣有趣!


🎯 本文你將學到什么?

🎬 設計模式英雄聯盟 🎬
┌─────────────────────────────────────┐
│  🦸?♂? 五位設計模式英雄登場!         │
│                                     │
│  🎭 單例俠:確保全局唯一            │
│  🏭 工廠俠:讓子類決定創建什么      │
│  🏭 抽象工廠俠:創建系列相關產品    │
│  🏭 建造者俠:分步驟構建復雜對象    │
│  🏭 原型俠:克隆現有對象            │
│                                     │
│  🚀 準備好開始冒險了嗎?            │
└─────────────────────────────────────┘

🏭 第一部分:單例模式(Singleton Pattern)

🎭 單例俠的登場 🎭
┌─────────────────────────────────────┐
│  👑 單例俠:我是唯一的存在!        │
│                                     │
│  🏢 公司CEO:"我要一個總經理!"     │
│  👔 單例俠:"只能有一個!"          │
│  🏢 公司CEO:"再來一個!"           │
│  👔 單例俠:"還是同一個!"          │
│                                     │
│  💡 核心思想:確保全局唯一          │
└─────────────────────────────────────┘

🏗? 單例模式UML類圖

uses
Singleton
-static Singleton instance
-Singleton()
+static Singleton getInstance()
+void doSomething()
Client
+void useSingleton()

?? 單例模式時序圖

客戶端1客戶端2單例類getInstance()檢查實例是否存在創建新實例alt[實例不存在-]返回實例getInstance()檢查實例是否存在返回相同實例客戶端1客戶端2單例類

1.1 🎭 什么是單例模式?

一句話理解:確保一個類只有一個實例,就像公司只有一個總經理!

定義:確保一個類只有一個實例,并提供一個全局訪問點。

應用場景:數據庫連接池、配置管理器、日志記錄器、緩存管理器

1.2 🛠? 單例模式的實現方式

實現方式特點推薦度
餓漢式線程安全,但可能浪費內存???
懶漢式延遲加載,但線程不安全??
雙重檢查鎖定延遲加載 + 線程安全????
枚舉單例自動線程安全,最優雅?????
1.2.1 🍔 餓漢式單例(Eager Singleton)

💡 小貼士:就像你提前準備好午餐一樣,餓漢式在類加載時就創建了實例,所以叫"餓漢"(迫不及待)!

特點:線程安全,但可能造成不必要的內存占用

public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return INSTANCE;}
}
1.2.2 😴 懶漢式單例(Lazy Singleton)

💡 小貼士:就像你等到餓了才去做飯一樣,懶漢式只有在第一次使用時才創建實例,所以叫"懶漢"(能拖就拖)!

特點:延遲加載,但需要處理線程安全問題

public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
1.2.3 🔒 雙重檢查鎖定單例(Double-Checked Locking)

💡 小貼士:這是懶漢式的升級版!就像你進房間前先敲門,確認沒人再進去,然后再鎖門一樣,雙重檢查確保線程安全!

特點:延遲加載 + 線程安全,性能最優

public class DoubleCheckedSingleton {private static volatile DoubleCheckedSingleton instance;private DoubleCheckedSingleton() {}public static DoubleCheckedSingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedSingleton.class) {if (instance == null) {instance = new DoubleCheckedSingleton();}}}return instance;}
}
1.2.4 🎯 枚舉單例(Enum Singleton)

💡 小貼士:這是Java中最優雅的單例實現方式!就像枚舉天生就是單例一樣,簡單、安全、優雅!

特點:自動線程安全,自動序列化安全,推薦使用

public enum EnumSingleton {INSTANCE;public void doSomething() {System.out.println("枚舉單例執行操作");}
}

📊 單例模式實現方式對比表

單例模式實現對比
線程安全
實現方式
延遲加載
性能
推薦度
餓漢式: 安全
懶漢式: 不安全
雙重檢查: 安全
枚舉: 安全
餓漢式: 否
懶漢式: 是
雙重檢查: 是
枚舉: 否
餓漢式: 高
懶漢式: 中
雙重檢查: 很高
枚舉: 最高
餓漢式: 推薦
懶漢式: 不推薦
雙重檢查: 強烈推薦
枚舉: 最推薦

1.3 🎯 單例模式的實際應用

// 配置管理器單例
public class ConfigManager {private static final ConfigManager INSTANCE = new ConfigManager();private final Properties properties;private ConfigManager() {properties = new Properties();loadConfig();}public static ConfigManager getInstance() {return INSTANCE;}private void loadConfig() {// 加載配置文件}public String getProperty(String key) {return properties.getProperty(key);}
}

🏭 第二部分:工廠方法模式(Factory Method Pattern)

🏭 工廠俠的登場 🏭
┌─────────────────────────────────────┐
│  🏭 工廠俠:我有多個車間!          │
│                                     │
│  🚗 轎車車間:"我要生產轎車!"      │
│  🚐 面包車車間:"我要生產面包車!"  │
│  🚚 卡車車間:"我要生產卡車!"      │
│                                     │
│  🏭 工廠俠:"每個車間都有自己的    │
│      制造方法,但都遵循同一協議!"  │
└─────────────────────────────────────┘

🏗? 工廠方法模式UML類圖

creates
creates
creates
?abstract?
Creator
+factoryMethod() : Product
+someOperation()
ConcreteCreatorA
+factoryMethod() : Product
ConcreteCreatorB
+factoryMethod() : Product
?interface?
Product
+operation()
ConcreteProductA
+operation()
ConcreteProductB
+operation()

?? 工廠方法模式時序圖

客戶端抽象工廠具體工廠抽象產品具體產品someOperation()factoryMethod()factoryMethod()new ConcreteProduct()return productoperation()operation()resultresultresult客戶端抽象工廠具體工廠抽象產品具體產品

2.1 🏭 什么是工廠方法模式?

一句話理解:讓子類決定創建什么對象,就像不同車間生產不同產品!

定義:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。

應用場景:數據庫連接器創建、日志記錄器創建、文件處理器創建

2.2 🛠? 工廠方法模式的實現

// 抽象產品
public interface Product {void operation();
}// 具體產品
public class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("具體產品A的操作");}
}// 抽象工廠
public interface Factory {Product createProduct();
}// 具體工廠
public class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}

2.3 🗄? 數據庫連接器工廠示例

// 數據庫連接器接口
public interface DatabaseConnector {void connect();void disconnect();void executeQuery(String sql);
}// MySQL連接器
public class MySQLConnector implements DatabaseConnector {@Overridepublic void connect() {System.out.println("連接到MySQL數據庫");}@Overridepublic void disconnect() {System.out.println("斷開MySQL數據庫連接");}@Overridepublic void executeQuery(String sql) {System.out.println("在MySQL中執行查詢: " + sql);}
}// 數據庫連接器工廠接口
public interface DatabaseConnectorFactory {DatabaseConnector createConnector();
}// MySQL連接器工廠
public class MySQLConnectorFactory implements DatabaseConnectorFactory {@Overridepublic DatabaseConnector createConnector() {return new MySQLConnector();}
}

🏭 第三部分:抽象工廠模式(Abstract Factory Pattern)

🏭 抽象工廠俠的登場 🏭
┌─────────────────────────────────────┐
│  🏭 抽象工廠俠:我提供完整生態!    │
│                                     │
│  📱 蘋果工廠:"iPhone + AirPods +   │
│      蘋果充電器,完美搭配!"        │
│  📱 三星工廠:"Galaxy + Galaxy Buds │
│      + 三星充電器,系列相關!"      │
│                                     │
│  🏭 抽象工廠俠:"確保產品兼容性!"  │
└─────────────────────────────────────┘

🏗? 抽象工廠模式UML類圖

creates
creates
creates
creates
creates
creates
?interface?
AbstractFactory
+createProductA() : AbstractProductA
+createProductB() : AbstractProductB
ConcreteFactory1
+createProductA() : AbstractProductA
+createProductB() : AbstractProductB
ConcreteFactory2
+createProductA() : AbstractProductA
+createProductB() : AbstractProductB
?interface?
AbstractProductA
+operationA()
?interface?
AbstractProductB
+operationB()
ProductA1
+operationA()
ProductA2
+operationA()
ProductB1
+operationB()
ProductB2
+operationB()

🏭 抽象工廠模式產品族結構

抽象工廠模式產品族
產品族1
產品族2
具體工廠1
抽象工廠
具體工廠2
產品A2
產品B2
產品A1
產品B1

3.1 🏭 什么是抽象工廠模式?

一句話理解:創建一系列相關產品,就像品牌提供完整生態!

定義:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們的具體類。

應用場景:UI組件庫、數據庫訪問層、操作系統適配、主題系統

3.2 🛠? 抽象工廠模式的實現

// 抽象產品A
public interface AbstractProductA {void operationA();
}// 抽象產品B
public interface AbstractProductB {void operationB();
}// 具體產品A1
public class ConcreteProductA1 implements AbstractProductA {@Overridepublic void operationA() {System.out.println("具體產品A1的操作");}
}// 抽象工廠
public interface AbstractFactory {AbstractProductA createProductA();AbstractProductB createProductB();
}// 具體工廠1
public class ConcreteFactory1 implements AbstractFactory {@Overridepublic AbstractProductA createProductA() {return new ConcreteProductA1();}@Overridepublic AbstractProductB createProductB() {return new ConcreteProductB1();}
}

3.3 🖥? UI組件工廠示例

// UI組件接口
public interface Button {void render();void onClick();
}public interface Checkbox {void render();void check();
}// Windows風格組件
public class WindowsButton implements Button {@Overridepublic void render() {System.out.println("渲染Windows風格按鈕");}@Overridepublic void onClick() {System.out.println("Windows按鈕點擊事件");}
}// UI工廠接口
public interface UIFactory {Button createButton();Checkbox createCheckbox();
}// Windows UI工廠
public class WindowsUIFactory implements UIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}

🏭 第四部分:建造者模式(Builder Pattern)

🏭 建造者俠的登場 🏭
┌─────────────────────────────────────┐
│  🏭 建造者俠:我一步步組裝!        │
│                                     │
│  🎨 步驟1:"選擇車身顏色!"         │
│  🚗 步驟2:"選擇發動機型號!"       │
│  🎵 步驟3:"選擇音響系統!"         │
│  🪑 步驟4:"選擇座椅材質!"         │
│                                     │
│  🏭 建造者俠:"最終組裝成獨一無二   │
│      的汽車!"                      │
└─────────────────────────────────────┘

🏗? 建造者模式UML類圖

uses
builds
builds
Director
-Builder builder
+setBuilder(builder)
+construct() : Product
?abstract?
Builder
-Product product
+buildPartA()
+buildPartB()
+buildPartC()
+getResult() : Product
ConcreteBuilder
+buildPartA()
+buildPartB()
+buildPartC()
Product
-String partA
-String partB
-String partC
+setPartA(partA)
+setPartB(partB)
+setPartC(partC)
+show()

🔄 建造者模式構建流程圖

開始構建
設置建造者
構建部件A
構建部件B
構建部件C
獲取最終產品
結束

?? 建造者模式時序圖

客戶端導演抽象建造者具體建造者產品setBuilder(builder)construct()buildPartA()buildPartA()setPartA()buildPartB()buildPartB()setPartB()buildPartC()buildPartC()setPartC()getResult()getResult()return productreturn productreturn product客戶端導演抽象建造者具體建造者產品

4.1 🏗? 什么是建造者模式?

一句話理解:分步驟構建復雜對象,就像定制汽車一步步組裝!

定義:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

應用場景:復雜對象的創建、參數較多的構造函數、鏈式調用

4.2 🛠? 建造者模式的實現

// 產品類
public class Computer {private String cpu;private String memory;private String storage;private String graphicsCard;private String motherboard;// Getters and Setterspublic String getCpu() { return cpu; }public void setCpu(String cpu) { this.cpu = cpu; }public String getMemory() { return memory; }public void setMemory(String memory) { this.memory = memory; }// ... 其他getter和setter@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", storage='" + storage + '\'' +", graphicsCard='" + graphicsCard + '\'' +", motherboard='" + motherboard + '\'' +'}';}
}// 抽象建造者
public abstract class ComputerBuilder {protected Computer computer = new Computer();public abstract void buildCpu();public abstract void buildMemory();public abstract void buildStorage();public abstract void buildGraphicsCard();public abstract void buildMotherboard();public Computer getResult() {return computer;}
}// 具體建造者 - 游戲電腦
public class GamingComputerBuilder extends ComputerBuilder {@Overridepublic void buildCpu() {computer.setCpu("Intel i9-12900K");}@Overridepublic void buildMemory() {computer.setMemory("32GB DDR5");}@Overridepublic void buildStorage() {computer.setStorage("2TB NVMe SSD");}@Overridepublic void buildGraphicsCard() {computer.setGraphicsCard("RTX 4090");}@Overridepublic void buildMotherboard() {computer.setMotherboard("Z690 Gaming");}
}// 導演類
public class ComputerDirector {private ComputerBuilder builder;public void setBuilder(ComputerBuilder builder) {this.builder = builder;}public Computer construct() {builder.buildCpu();builder.buildMemory();builder.buildStorage();builder.buildGraphicsCard();builder.buildMotherboard();return builder.getResult();}
}

4.3 🔗 鏈式建造者(Fluent Builder)

// 鏈式建造者
public class Computer {private String cpu;private String memory;private String storage;private String graphicsCard;private String motherboard;private Computer() {}public static ComputerBuilder builder() {return new ComputerBuilder();}// 內部建造者類public static class ComputerBuilder {private Computer computer = new Computer();public ComputerBuilder cpu(String cpu) {computer.cpu = cpu;return this;}public ComputerBuilder memory(String memory) {computer.memory = memory;return this;}public ComputerBuilder storage(String storage) {computer.storage = storage;return this;}public ComputerBuilder graphicsCard(String graphicsCard) {computer.graphicsCard = graphicsCard;return this;}public ComputerBuilder motherboard(String motherboard) {computer.motherboard = motherboard;return this;}public Computer build() {// 驗證必填字段if (computer.cpu == null) {throw new IllegalArgumentException("CPU是必填項");}if (computer.memory == null) {throw new IllegalArgumentException("內存是必填項");}return computer;}}
}// 使用示例
public class ChainBuilderDemo {public static void main(String[] args) {Computer computer = Computer.builder().cpu("Intel i7-12700K").memory("32GB DDR4").storage("1TB NVMe SSD").graphicsCard("RTX 3080").motherboard("Z690").build();System.out.println("鏈式構建的電腦: " + computer);}
}

🏭 第五部分:原型模式(Prototype Pattern)

🏭 原型俠的登場 🏭
┌─────────────────────────────────────┐
│  🏭 原型俠:我會克隆!              │
│                                     │
│  🧬 科學家:"我要復制這個細胞!"    │
│  🏭 原型俠:"克隆成功!"            │
│  🧬 科學家:"我要創建新變種!"      │
│  🏭 原型俠:"基于原型創建!"        │
│                                     │
│  🏭 原型俠:"避免重新培養的復雜     │
│      過程!"                        │
└─────────────────────────────────────┘

🏗? 原型模式UML類圖

uses
?interface?
Prototype
+clone() : Prototype
ConcretePrototype
-String name
-int age
-List<String> hobbies
+clone() : Prototype
+setName(name)
+setAge(age)
+setHobbies(hobbies)
Client
-Prototype prototype
+setPrototype(prototype)
+operation() : Prototype

🧬 原型模式克隆流程圖

淺拷貝
深拷貝
原始對象
選擇拷貝類型
復制對象引用
復制對象及其引用對象
返回淺拷貝對象
返回深拷貝對象
修改可能影響原對象
修改不影響原對象

5.1 🧬 什么是原型模式?

一句話理解:克隆現有對象創建新對象,就像生物克隆一樣神奇!

定義:用原型實例指定創建對象的種類,并且通過復制這些原型創建新的對象。

應用場景:對象創建成本較高、避免構造函數的約束、動態加載類

5.2 🛠? 原型模式的實現

// 原型接口
public interface Prototype extends Cloneable {Prototype clone();
}// 具體原型
public class ConcretePrototype implements Prototype {private String name;private int age;private List<String> hobbies;public ConcretePrototype(String name, int age, List<String> hobbies) {this.name = name;this.age = age;this.hobbies = new ArrayList<>(hobbies);}@Overridepublic Prototype clone() {try {ConcretePrototype cloned = (ConcretePrototype) super.clone();// 深拷貝hobbies列表cloned.hobbies = new ArrayList<>(this.hobbies);return cloned;} catch (CloneNotSupportedException e) {throw new RuntimeException("克隆失敗", e);}}// Getters and Setterspublic String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }public List<String> getHobbies() { return hobbies; }public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }@Overridepublic String toString() {return "ConcretePrototype{" +"name='" + name + '\'' +", age=" + age +", hobbies=" + hobbies +'}';}
}

5.3 📄 文檔模板系統示例

// 文檔接口
public interface Document extends Cloneable {Document clone();void setContent(String content);void setAuthor(String author);void setDate(String date);void display();
}// 報告文檔
public class Report implements Document {private String title;private String content;private String author;private String date;private List<String> sections;public Report(String title) {this.title = title;this.sections = new ArrayList<>();}@Overridepublic Document clone() {try {Report cloned = (Report) super.clone();// 深拷貝sections列表cloned.sections = new ArrayList<>(this.sections);return cloned;} catch (CloneNotSupportedException e) {throw new RuntimeException("克隆失敗", e);}}@Overridepublic void setContent(String content) {this.content = content;}@Overridepublic void setAuthor(String author) {this.author = author;}@Overridepublic void setDate(String date) {this.date = date;}public void addSection(String section) {sections.add(section);}@Overridepublic void display() {System.out.println("報告標題: " + title);System.out.println("作者: " + author);System.out.println("日期: " + date);System.out.println("內容: " + content);System.out.println("章節: " + sections);}
}// 文檔管理器
public class DocumentManager {private Map<String, Document> prototypes = new HashMap<>();public void addPrototype(String key, Document document) {prototypes.put(key, document);}public Document getClone(String key) {Document prototype = prototypes.get(key);if (prototype == null) {throw new IllegalArgumentException("原型不存在: " + key);}return prototype.clone();}
}

5.4 🔍 深拷貝與淺拷貝

拷貝類型特點適用場景
淺拷貝只復制對象引用,不復制引用對象簡單對象,無嵌套引用
深拷貝復制對象及其所有引用對象復雜對象,有嵌套引用

關鍵點:原型模式中通常需要深拷貝來避免對象間的相互影響。

// 淺拷貝示例
public class ShallowCopyExample {public static void main(String[] args) {List<String> originalList = Arrays.asList("Java", "Python", "C++");ConcretePrototype original = new ConcretePrototype("張三", 25, originalList);ConcretePrototype cloned = (ConcretePrototype) original.clone();// 修改原始對象的hobbiesoriginal.getHobbies().add("JavaScript");System.out.println("原始對象: " + original);System.out.println("克隆對象: " + cloned);// 注意:淺拷貝時,克隆對象的hobbies也會被修改}
}// 深拷貝實現
public class DeepCopyExample {public static void main(String[] args) {List<String> originalList = Arrays.asList("Java", "Python", "C++");ConcretePrototype original = new ConcretePrototype("張三", 25, originalList);ConcretePrototype cloned = (ConcretePrototype) original.clone();// 修改原始對象的hobbiesoriginal.getHobbies().add("JavaScript");System.out.println("原始對象: " + original);System.out.println("克隆對象: " + cloned);// 深拷貝時,克隆對象的hobbies不會被修改}
}

🎉 總結:創建型設計模式大揭秘

🎬 設計模式英雄聯盟大結局 🎬
┌─────────────────────────────────────┐
│  🎊 恭喜你完成學習之旅!            │
│                                     │
│  🎭 單例俠:"我是唯一的存在!"      │
│  🏭 工廠俠:"我讓子類選擇!"        │
│  🏭 抽象工廠俠:"我創建系列產品!"  │
│  🏭 建造者俠:"我一步步組裝!"      │
│  🏭 原型俠:"我會克隆!"            │
│                                     │
│  🦸?♂? 五位英雄聯手,代碼更優雅!    │
└─────────────────────────────────────┘

🏆 創建型設計模式對比表

創建型設計模式對比
核心思想
設計模式
適用場景
優缺點
記憶技巧
單例: 確保全局唯一
工廠方法: 讓子類決定創建
抽象工廠: 創建系列產品
建造者: 分步驟構建
原型: 克隆現有對象
單例: 全局唯一資源
工廠方法: 動態選擇產品
抽象工廠: 系列相關產品
建造者: 復雜對象構建
原型: 對象克隆復制
單例: 簡單但可能過度使用
工廠方法: 靈活但增加復雜度
抽象工廠: 系列兼容但復雜
建造者: 靈活構建但代碼多
原型: 高效但需注意拷貝
單例: 公司只有一個總經理
工廠方法: 不同車間生產不同產品
抽象工廠: 品牌提供完整生態
建造者: 定制汽車一步步組裝
原型: 生物克隆復制對象

🎯 設計模式選擇流程圖

需要全局唯一
需要動態選擇
需要系列產品
需要復雜構建
需要對象克隆
需要創建對象
對象創建需求
單例模式
工廠方法模式
抽象工廠模式
建造者模式
原型模式
數據庫連接池
配置管理器
日志記錄器
數據庫連接器
日志記錄器
文件處理器
UI組件庫
數據庫訪問層
主題系統
復雜對象構建
參數化構造
鏈式調用
對象克隆
模板復制
原型創建

🧠 創建型設計模式思維導圖

創建型設計模式
單例模式
工廠方法模式
抽象工廠模式
建造者模式
原型模式
全局唯一
私有構造函數
靜態實例
線程安全
應用場景
數據庫連接池
配置管理器
日志記錄器
動態選擇
抽象工廠
具體工廠
開閉原則
應用場景
數據庫連接器
日志記錄器
文件處理器
系列產品
產品族
產品等級
兼容性
應用場景
UI組件庫
數據庫訪問層
主題系統
分步構建
復雜對象
鏈式調用
導演模式
應用場景
復雜對象構建
參數化構造
鏈式調用
對象克隆
淺拷貝
深拷貝
性能優化
應用場景
對象克隆
模板復制
原型創建

🎯 選擇建議(簡單記憶法):

  • 🎭 單例模式:當你需要"唯一"時
  • 🏭 工廠方法模式:當你需要"選擇"時
  • 🏭 抽象工廠模式:當你需要"系列"時
  • 🏭 建造者模式:當你需要"組裝"時
  • 🏭 原型模式:當你需要"復制"時

🏗? 實際應用場景架構圖

企業級應用架構
設計模式應用
具體應用場景
業務邏輯層
客戶端層
數據訪問層
服務層
移動應用
Web應用
桌面應用
微服務
工廠方法模式
數據連接器
單例模式
配置管理器
抽象工廠模式
UI組件庫
建造者模式
復雜對象構建
原型模式
對象克隆

💡 實踐要點:

  1. 🎯 理解場景:根據具體業務場景選擇合適的設計模式
  2. 🚫 避免過度設計:不是所有地方都需要使用設計模式(不要為了用而用)
  3. ? 考慮性能:設計模式可能帶來一定的性能開銷
  4. ? 保持簡單:優先選擇簡單的解決方案(KISS原則)

🎊 恭喜你!

通過這次學習,你已經掌握了創建型設計模式的核心思想!現在你可以在實際項目中:

  • 🎯 更好地管理對象的創建過程
  • 🚀 提高代碼的可維護性和可擴展性
  • 💪 寫出更優雅、更專業的代碼

記住:設計模式不是銀彈,而是工具箱中的工具。選擇合適的設計模式,讓你的代碼更加優雅!🌟


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘gensim’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘gensim’問題 摘要 在使用 PyCharm 2025 進行 Python 開發時&#xff0c;常常需要通過 pip install 安裝第三方包以豐富項目功能。但在安裝 gensim 等包時&…

【嵌入式電機控制#26】BLDC:三相模擬采集

之前有些網友試著用有刷的平均電流法采集三相&#xff0c;還搞了個閉環控制。求&#xff01;結果直接把驅動板給干沒了......做過仿真的朋友們都知道&#xff0c;無刷電機的相電流波形是介于方波和正弦波的。如果拿平均電流去測量&#xff0c;很不靠譜。這節內容為大家分享采集…

ref存儲對象和reactive深度響應式遞歸地對對象的嵌套屬性進行響應式處理

ref 不會遞歸地對 對象 或 數組 中的每個屬性或元素進行深度響應式處理。如果你需要遞歸處理嵌套屬性&#xff0c;reactive 是更適合的選擇。讓我通過具體的例子來展示這一點。 例子&#xff1a;ref 存儲對象和嵌套對象 1. 使用 ref 存儲嵌套對象&#xff1a; import { createA…

小鵬汽車前端面經

前端基礎與瀏覽器機制 (Front-End Fundamentals & Browser Mechanics) 這些問題涵蓋了Web工作的基本原理&#xff0c;包括網絡、渲染和瀏覽器特性。 1. 瀏覽器渲染與性能 (Browser Rendering & Performance) URL輸入發生什么&#xff1f;(What happens when you type a…

利用DeepSeek編寫go語言按行排序程序

聽說google出品的go語言也是系統開發中常用的&#xff0c;性能到底怎么樣&#xff0c;還是老辦法&#xff0c;讓DeepSeek寫個程序跑一下&#xff0c;基于以往的經驗&#xff0c;直接讓它同時編寫有緩沖和無緩沖版本。 package mainimport ("bufio""fmt"&qu…

《解構Angular組件變化檢測:從自動到手 動的效能突破》

為何有時數據更新后視圖卻無動于衷?為何看似簡單的操作會引發連鎖式的性能損耗?要解開這些疑問,需要穿透表層的API調用,深入到框架設計的底層邏輯中去。變化檢測的核心使命,是確保視圖層能夠準確反映數據層的當前狀態。這種"數據-視圖"的同步關系,是所有前端框…

書單 | AI編程+Python+Go三大核心領域書單

這份書單聚焦AI編程、Python開發、Go語言三大核心領域&#xff0c;精選6本本月 最具前瞻性的技術圖書&#xff0c;為你構建"工具鏈業務層系統層"的全棧能力。 1、人人皆可Vibe編程&#xff1a;玩轉氛圍編程 作者&#xff1a;池志煒,薛志榮 本書圍繞Vibe編程這一AI驅…

Kali Linux 2025.2基于MITRE ATTCK框架

從徹底革新的菜單結構到新增的13款尖端工具&#xff0c;再到首次支持智能手表Wi-Fi注入&#xff0c;Kali Linux 2025.2為紅隊、藍隊以及安全研究人員提供了更高效、更直觀的工具生態。菜單結構大變革&#xff1a;基于MITRE ATT&CK框架Kali Linux 2025.2最引人注目的變化之一…

javacc實現簡單SQL解析器

文章目錄前言本章節源碼需求1&#xff1a;實現一個最簡單的select sql要求實現jj文件編譯測試需求2&#xff1a;理解Token及其他屬性說明javajj文件需求3&#xff1a;實現解析得到SQL語法樹 & 精確點位資料獲取前言 博主介紹&#xff1a;?目前全網粉絲4W&#xff0c;csdn…

Odoo OWL前端框架全面學習指南 (后端開發者視角)

核心理念&#xff1a; 將您熟悉的Odoo后端MVCORM架構思想&#xff0c;完整映射到前端OWL組件化開發中&#xff0c;讓您在熟悉的概念體系下&#xff0c;快速掌握新的技術棧。第一部分&#xff1a;核心概念映射與環境搭建內容摘要&#xff1a; 本部分旨在建立后端與前端最核心的概…

Java開發工具包,jdk,idea,VMware,rocketmq,redis,CentOS7

Java開發工具包&#xff0c;jdk&#xff0c;idea&#xff0c;VMware&#xff0c;rocketmq&#xff0c;redis&#xff0c;CentOS7 下載地址 通過網盤分享的文件&#xff1a;Java開發環境工具包 鏈接: https://pan.baidu.com/s/1eJqvPx5DYqtmXgmEtOl8-A?pwdcj1f 提取碼: cj1f –…

macOS Python 安裝

目錄 一、確認系統環境 二、安裝 &#xff08;一&#xff09;下載安裝包 &#xff08;二&#xff09;安裝過程 三、配置環境變量 四、驗證安裝 一、確認系統環境 在安裝 Python 之前&#xff0c;我們先簡單了解一下自己的 MACOS 系統。可以點擊屏幕左上角的蘋果菜單&…

MySQL 全方位解析:從基礎到高可用架構

1. 介紹 (Introduction) 1.1. 什么是 MySQL&#xff1f; MySQL 是全球最受歡迎的開源關系型數據庫管理系統 (Relational Database Management System, RDBMS)。它由瑞典的 MySQL AB 公司開發&#xff0c;現隸屬于 Oracle 公司。MySQL 將數據存儲在不同的、預先定義好結構的表中…

力扣熱題100——滑動窗口

無重復字符的最長子串步驟 1&#xff1a;初始狀態 字符串 s “abcabcbb”&#xff0c;哈希表 charSet 初始為空&#xff0c;雙指針 left 0&#xff0c;right 0。 哈希表&#xff08;charSet&#xff09;&#xff1a; {} 字符串&#xff1a; a b c a b c b b 指…

SOD-YOLO:增強基于YOLO的無人機影像小目標檢測

摘要 https://www.arxiv.org/pdf/2507.12727 小目標檢測仍是目標檢測領域中的一個挑戰性問題。為應對這一挑戰&#xff0c;我們提出了一種基于YOLOv8的增強模型SOD-YOLO。該模型在頸部&#xff08;neck&#xff09;中集成了ASF&#xff08;注意力尺度序列融合&#xff09;機制以…

監督微調-指令微調-偏好微調

有監督微調 有監督微調是使用輸入及其標簽對的典型情況。例如&#xff0c;判斷郵件是垃圾郵件還是非垃圾郵件&#xff0c;判斷情感是積極還是消極。根據文檔的主要主題對其進行分類也是一種常見應用。模型會將輸入文本的相應表示&#xff08;隱藏狀態或嵌入向量&#xff09;作為…

樓宇自控系統對建筑碳中和目標的實現具重要價值

隨著全球氣候變化問題日益嚴峻&#xff0c;建筑行業作為碳排放的重要來源之一&#xff0c;其節能減排工作備受關注。樓宇自控系統&#xff08;Building Automation System&#xff0c;BAS&#xff09;作為智能建筑的核心組成部分&#xff0c;通過集成控制、監測和管理建筑內的各…

【YOLO學習筆記】YOLOv5詳解

一、數據增強 mosaic仿射變換與透視變換Mixup mosaic代碼位置仿射變換 與 透視變換?代碼片段位置 二、網絡結構 1. 網絡不同尺寸 nsmlx與網絡深寬度 yolov5 官方提供了5個目標檢測的網絡版本&#xff1a;yolov5n、yolov5s、yolov5m、yolov5l、yolov5x &#xff0c;早年是…

WebRTC前處理模塊技術詳解:音頻3A處理與視頻優化實踐

一、WebRTC前處理模塊概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;作為實時音視頻通信的核心技術&#xff0c;其前處理模塊是提升媒體質量的關鍵環節。該模塊位于媒體采集與編碼之間&#xff0c;通過對原始音頻/視頻數據進行優化處理&#xff0c;解決實時…

ssm復習

Spring Framework系統架構核心容器的學習IOC/DIIOC容器IOC使用對象時,由主動new產生的對象轉換為由外部提供對象,此過程中對象的創建的控制權交由外部,此思想稱為控制反轉, (實現了自己new的解耦) 對象創建的控制權Spring提供一個容器,稱為IOC容器 用來充當IOC思想的外部Bea…