设计模式解析

71 浏览
5 试用
0 购买
Aug 26, 2025更新

深入讲解指定设计模式的用途、结构及代码示例

示例1

### 单例模式(Singleton Pattern)

#### **作用**
单例模式是一种创建型设计模式,旨在确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点(通常是一个公共的方法或属性)来获取这个唯一的实例。

主要作用包括:
1. **节省资源**:避免重复创建对象,节省内存和处理资源。
2. **全局访问**:通过确定的单实例,方便在整个系统范围内进行统一管理、共享状态或提供统一行为。
3. **控制访问**:集中控制单个实例的生命周期和行为。

---

#### **结构(关键组件与角色)**

单例模式的核心结构可以分为以下几部分:
1. **私有构造函数(Private Constructor)**:
   - 防止外部类直接创建实例,保证控制权归单例类所有。
2. **私有静态变量(Private Static Instance)**:
   - 用于存储唯一的类实例。
3. **公共静态方法(Public Static Method, 如 getInstance 方法)**:
   - 提供全局访问点,用于返回单例实例。
4. **可选:线程安全机制**:
   - 在多线程环境中,通常需要对单例的创建过程进行线程同步处理。

---

#### **常见使用场景**
- **配置管理**:用于存储全局配置信息(如`DatabaseConfig`,`ApplicationConfig`)。
- **日志记录器**:如 `Logger` 类,允许在整个应用中共享同一个日志对象。
- **连接池**:如业务系统的数据库连接池、线程池等资源管理类。
- **缓存管理**:全局共享的缓存对象,避免重复加载数据。
- **文件系统操作**:文件管理器,统一文件操作和访问。

---

#### **优点**
1. **唯一实例**:强制保证全局范围内只有一个实例存在。
2. **节省资源**:共享单个实例,避免重复创建大量开销对象。
3. **全局访问**:通过单一访问点统一管理对象,简化使用。

#### **缺点**
1. **难以扩展**:由于构造函数是私有的,难以通过继承扩展其实现。
2. **隐藏依赖**:单例对象可被随意访问,可能导致无法清晰追踪依赖关系,降低代码的可测试性。
3. **线程安全问题**(在无保护措施时):需要小心处理多线程环境,避免出现多个实例。

---

#### **Java 中的单例模式实现**

- **方式一:饿汉式(急切加载)**
  - 优点:线程安全,实例在类加载时创建。
  - 缺点:提前创建实例,可能造成资源浪费。

```java
public class Singleton {
    // 静态变量保存类的唯一实例
    private static final Singleton instance = new Singleton();

    // 私有构造函数,防止外部创建实例
    private Singleton() {}

    // 提供全局访问点
    public static Singleton getInstance() {
        return instance;
    }
}
```

---

- **方式二:懒汉式(延迟加载)**
  - 优点:实例在第一次调用时创建,节省资源。
  - 缺点:在多线程环境下,不保证线程安全。

```java
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    // 非线程安全版本
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
```

---

- **方式三:线程安全的懒汉式(双重检查锁定)**
  - 优点:兼顾延迟加载与线程安全,性能较好。
  - 缺点:代码相对复杂。

```java
public class Singleton {
    // 使用 volatile 关键字确保多线程下的可见性与有序性
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
```

---

- **方式四:静态内部类(推荐)**
  - 优点:利用 JVM 的类加载特性,保证线程安全和按需加载(懒加载)。
  - 缺点:无明显缺点,通常是最佳实践。

```java
public class Singleton {
    private Singleton() {}

    // 静态内部类实现单例模式
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
```

---

#### **总结**
1. **不同实现版本选择**:
   - 对于简单场景(非多线程),可以选择饿汉式;
   - 在多线程中,优先选择线程安全版本(如静态内部类或双重检查锁定)。
2. **线程安全性**:在现代 Java 开发中,常建议优先使用静态内部类的实现方式,简单高效。
3. **嵌套优化**:理解 JVM 的类加载机制,帮助设计出更高效的单例模式。

示例2

### 工厂模式(Factory Pattern)

工厂模式是一种**创建型设计模式**,它提供了一种创建对象的方式,可以将对象的实例化过程隐藏起来,使得客户端代码与具体的类解耦。工厂模式允许客户端通过调用工厂方法来获取对象,而无需指定对象的具体类,也能更方便地适应后续对象种类的扩展。

### 工厂模式的作用
1. **解耦**:客户端代码与具体对象的创建逻辑解耦;当需要更改实例化逻辑时,可以只改动工厂方法,而无需影响客户端代码。
2. **提高灵活性**:通过定义一个通用接口,工厂模式使得应用能够轻易扩展新类型的对象。
3. **简化代码**:对象创建集中到工厂方法中便于集中管理,而不是分散到代码中。

---

### 结构(关键组件与角色)
1. **产品(Product)**:
   - 工厂模式要创建的对象,这些对象通常具有统一的接口或基类。
   
2. **具体产品(Concrete Product)**:
   - 继承产品接口的具体实现类,表示工厂可以创建的具体对象。
   
3. **工厂(Factory)**:
   - 提供创建产品对象的方法。可以通过方法或函数提供,隐藏具体产品对象的创建方式。
   
4. **客户端(Client)**:
   - 调用工厂方法获取产品对象。

---

### 常见使用场景
1. **需要大量创建相似对象**,并希望将创建逻辑与使用逻辑分离。
2. 当具体产品的类名不应该出现在客户端代码中时。
3. 当需要在运行时根据条件选择创建不同类型的对象时。
4. 在某些框架中,工厂模式用于提供对不同功能模块的统一创建入口。

---

### 工厂模式的优缺点
**优点**:
1. **解耦创建逻辑**:将创建逻辑从客户端中提取出来,易于维护。
2. **扩展性**:增加新的产品时只需要扩展工厂方法,而不需要改动其他代码。
3. **提高代码复用性**:可以通过同一个工厂接口生成不同对象。

**缺点**:
1. **复杂性增加**:增加了额外的类或函数,引入了更多抽象。
2. **不明确的依赖**:需要阅览工厂的具体实现才能完全了解它能创建哪些对象。

---

### 工厂模式实现方式(Python 示例)

以下是一个简单的代码示例,通过工厂模式实现一种汽车制造工厂。

```python
from abc import ABC, abstractmethod

# Step 1: 定义产品接口
class Car(ABC):
    @abstractmethod
    def drive(self) -> str:
        pass

# Step 2: 定义具体产品(继承产品接口)
class Sedan(Car):  # 轿车
    def drive(self) -> str:
        return "Driving a Sedan car."

class SUV(Car):  # SUV
    def drive(self) -> str:
        return "Driving an SUV car."

# Step 3: 定义工厂类
class CarFactory:
    @staticmethod
    def create_car(car_type: str) -> Car:
        if car_type == "Sedan":
            return Sedan()
        elif car_type == "SUV":
            return SUV()
        else:
            raise ValueError(f"Unknown car type: {car_type}")

# Step 4: 客户端代码
if __name__ == "__main__":
    # 客户端根据需求通过工厂创建对象,而不需要直接依赖具体类
    car1 = CarFactory.create_car("Sedan")
    print(car1.drive())  # Output: Driving a Sedan car.

    car2 = CarFactory.create_car("SUV")
    print(car2.drive())  # Output: Driving an SUV car.

    # 如果传递一个未知产品类型,将抛出异常
    try:
        car3 = CarFactory.create_car("Truck")
    except ValueError as e:
        print(e)  # Output: Unknown car type: Truck
```

---

### 示例解析
1. **产品接口(`Car`)**:
   定义了所有汽车的公共接口(类似于抽象类的意义,让所有产品具有一致的行为)。
   
2. **具体产品(`Sedan` 和 `SUV`)**:
   不同种类的汽车实现了产品接口的行为,代表具体的实现类。
   
3. **工厂类(`CarFactory`)**:
   静态工厂方法 `create_car` 负责根据输入参数决定具体创建哪种汽车。
   
4. **客户端**:
   客户端代码通过调用 `CarFactory` 的工厂方法获取需要的产品,而不是直接实例化具体的产品类。

---

### 使用工厂模式的关键点
1. 如果对象的创建逻辑简单,直接使用类构造方法可能更简洁。
2. 当需要未来扩展的灵活性时(比如新增一种新产品),可以考虑使用工厂模式。
3. 在 Python 中,函数和 lambda 也可以用作简单的工厂,比如直接用一个字典映射类型到具体类。

例如,用字典改写工厂逻辑:
```python
factory_map = {
    "Sedan": Sedan,
    "SUV": SUV
}

car_type = "Sedan"
car = factory_map.get(car_type, lambda: None)()
print(car.drive())  # Output: Driving a Sedan car.
```

---

### 总结
工厂模式在 Python 中是一种创建对象的标准做法,适合需要解耦产品使用与创建逻辑的场景。通过合理的工厂模式设计,系统可以保持开闭原则的高扩展性,同时满足软件架构的设计需求。

示例3

### 观察者模式(Observer Pattern)在C++中的讲解

#### 作用
观察者模式是一种行为设计模式,能够定义一种**一对多的依赖**关系。当一个对象的状态发生改变时,会自动通知依赖于它的其它对象,并自动更新(使观察者保持同步)。它是一种**松耦合**的设计方式,发布者(Subject)和订阅者(Observers)之间不直接依赖彼此的实现。

观察者模式在需要事件驱动的系统中广泛应用,比如 UI 系统、事件通知、日志系统、定制化消息广播等。

---

#### 结构(关键组件与角色)
观察者模式的结构一般分为以下几个主要角色:

1. **Subject(被观察者/主题)**  
   被观察的对象,提供管理观察者的方法(添加、删除),并负责在自己的状态发生变化时通知所有观察者。

2. **Observer(观察者)**  
   观察对象的接口,定义具体观察者收到通知时的操作行为。

3. **ConcreteSubject(具体主题)**  
   被观察者的具体实现类,继承并实现了 `Subject` 接口,维护其自身状态并通知观察者。

4. **ConcreteObserver(具体观察者)**  
   具体实现 `Observer` 接口的类,响应 `ConcreteSubject` 发出的通知。

---

#### 常见使用场景
1. **GUI系统中的事件处理**  
   当用户操作(如点击按钮、输入文本)时,需要通知多个组件以更新其状态。

2. **订阅-发布系统**  
   比如使用者订阅特定话题,当消息发布时所有订阅者都收到通知。

3. **MVC 模式**  
   在模型(Model)和视图(View)之间,用观察者模式保持视图数据和模型同步。

4. **游戏引擎中的事件系统**  
   游戏角色的血量变化通知 UI 界面更新。

---

#### 优点
1. **松耦合**  
   观察者和主题之间耦合性较低,便于扩展和复用。

2. **灵活性**  
   可以动态添加、移除观察者,动态调整系统的行为。

3. **多目标同步**  
   一个主题可以同步通知多个观察者。

---

#### 缺点
1. **性能问题**  
   如果有大量观察者且频繁通知,可能带来性能开销(CPU 消耗较大)。

2. **调试复杂性**  
   当有多个观察者被调用时,可能会引入难以调试的问题,特别是在观察者链条较长或有循环依赖的情况下。

---

#### C++ 实现代码示例
以下我们通过一个股票市场通知系统来展示观察者模式的实现。在这个系统中,`StockMarket` 是被观察对象,当股价变化时,会通知所有的投资者(观察者)。

```cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

// 观察者抽象接口
class Observer {
public:
    virtual void update(float price) = 0;  // 定义接收通知的方法
    virtual ~Observer() {}
};

// 被观察者抽象类
class Subject {
public:
    virtual void attach(Observer* observer) = 0;  // 添加观察者
    virtual void detach(Observer* observer) = 0;  // 移除观察者
    virtual void notify() = 0;                   // 通知所有观察者
    virtual ~Subject() {}
};

// 具体被观察对象(股票市场)
class StockMarket : public Subject {
private:
    vector<Observer*> observers;  // 存储观察者集合
    float stockPrice;  // 股票价格

public:
    void setPrice(float price) {
        stockPrice = price;
        notify();  // 通知所有观察者价格已更新
    }

    float getPrice() const {
        return stockPrice;
    }

    // 添加观察者到列表
    void attach(Observer* observer) override {
        observers.push_back(observer);
    }

    // 从列表中移除观察者
    void detach(Observer* observer) override {
        observers.erase(remove(observers.begin(), observers.end(), observer), observers.end());
    }

    // 通知所有观察者
    void notify() override {
        for (Observer* observer : observers) {
            observer->update(stockPrice);
        }
    }
};

// 具体观察者(投资者)
class Investor : public Observer {
private:
    string name;

public:
    Investor(string name) : name(name) {}
    
    // 实现更新通知
    void update(float price) override {
        cout << "Investor " << name << " is notified: New stock price = " << price << endl;
    }
};

int main() {
    // 创建被观察者(股票市场)
    StockMarket market;

    // 创建观察者(投资者)
    Investor investor1("Alice");
    Investor investor2("Bob");
    Investor investor3("Charlie");

    // 注册观察者
    market.attach(&investor1);
    market.attach(&investor2);
    market.attach(&investor3);

    // 修改股票价格,并观察通知机制
    market.setPrice(100.5f);
    cout << "---" << endl;

    market.setPrice(120.75f);
    cout << "---" << endl;

    // 移除某个观察者并再次通知
    market.detach(&investor2);
    market.setPrice(140.0f);

    return 0;
}
```

---

#### 程序输出
```
Investor Alice is notified: New stock price = 100.5
Investor Bob is notified: New stock price = 100.5
Investor Charlie is notified: New stock price = 100.5
---
Investor Alice is notified: New stock price = 120.75
Investor Bob is notified: New stock price = 120.75
Investor Charlie is notified: New stock price = 120.75
---
Investor Alice is notified: New stock price = 140
Investor Charlie is notified: New stock price = 140
```

---

#### 代码说明
1. **核心逻辑**  
   `StockMarket` 是被观察者(Subject),它维护了一个观察者的列表,当股价变化时调用 `notify()` 来通知所有注册的观察者。

2. **动态绑定**  
   观察者通过抽象类 `Observer` 实现,体现了多态机制,不同的观察者可以实现特定的通知处理逻辑。

3. **动态管理观察者**  
   可以通过 `attach()` 和 `detach()` 在运行时增加或移除观察者。

---

观察者模式的实现简单且强大,特别适合需要扩展性强的通知系统。但也要慎用,否则会因过度通知、链式依赖等导致系统复杂性提升。

适用用户

软件开发者

从事系统开发的程序员,使用提示词快速掌握设计模式理论,学习代码实现,并将其用于项目开发。

技术团队负责人

想提升团队架构能力的技术领袖,利用本提示词快速生成教学材料并推广设计模式知识,使团队开发更高效。

技术内容创作者

从事技术教程、博客、书籍撰写的内容创作者,通过提示词快速建立高质量架构文章模板,提高创作效率。

在校学生与应届生

计算机相关专业的学生,用本提示词深入理解设计模式课程,掌握开发项目所需实际技能,巩固学习成果。

技术咨询与架构顾问

为企业提供架构与工具优化建议的专家,使用提示词快速生成清晰的模式解读,为客户提供专业解决方案。

解决的问题

帮助用户深入理解并掌握指定设计模式的用途、结构及实现方法,通过清晰的讲解和实例代码提升技术技能,从而解决实际开发中的架构问题,并在项目实施中充分运用到设计模式的核心思想。

特征总结

系统化解析设计模式,让您轻松理解核心原理和用途,快速掌握复杂的架构设计思路。
支持多种编程语言应用,每次可定制语言环境实例,更贴近开发者实际需求。
一键生成清晰简洁的代码示例,降低学习门槛,轻松将理论转化为实践。
深入分析设计模式的组件与角色结构,帮助明确开发中的职责分工与协作逻辑。
涵盖常见应用场景,结合实际案例展示,帮助用户对号入座,找到最佳实践方式。
全面讲解优缺点,自动生成权衡建议,辅助开发者在不同项目中灵活选择实现。
模板化内容生成,高效进行知识迁移,适用于培训、文档撰写与技术知识传播。
针对用户输入的需求和行业背景,生成定制化的设计模式解读,适配场景多样性。
自动优化内容结构,逻辑清晰流畅,帮助用户快速学习,无需额外整理或加工。

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

10积分 20积分
立减 50%
限时优惠还剩 00:00:00

您购买后可以获得什么

获得完整提示词模板
- 共 77 tokens
- 2 个可调节参数
{ 设计模式名称 } { 编程语言 }
自动加入"我的提示词库"
- 获得提示词优化器支持
- 版本化管理支持
获得社区共享的应用案例
限时免费

不要错过!

免费获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59
摄影
免费 原价:20 限时
试用