热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
深入讲解指定设计模式的用途、结构及代码示例
单例模式是一种创建型设计模式,旨在确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点(通常是一个公共的方法或属性)来获取这个唯一的实例。
主要作用包括:
单例模式的核心结构可以分为以下几部分:
DatabaseConfig
,ApplicationConfig
)。Logger
类,允许在整个应用中共享同一个日志对象。public class Singleton {
// 静态变量保存类的唯一实例
private static final Singleton instance = new Singleton();
// 私有构造函数,防止外部创建实例
private Singleton() {}
// 提供全局访问点
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private static Singleton instance;
private Singleton() {}
// 非线程安全版本
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
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;
}
}
public class Singleton {
private Singleton() {}
// 静态内部类实现单例模式
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,可以将对象的实例化过程隐藏起来,使得客户端代码与具体的类解耦。工厂模式允许客户端通过调用工厂方法来获取对象,而无需指定对象的具体类,也能更方便地适应后续对象种类的扩展。
产品(Product):
具体产品(Concrete Product):
工厂(Factory):
客户端(Client):
优点:
缺点:
以下是一个简单的代码示例,通过工厂模式实现一种汽车制造工厂。
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
产品接口(Car
):
定义了所有汽车的公共接口(类似于抽象类的意义,让所有产品具有一致的行为)。
具体产品(Sedan
和 SUV
):
不同种类的汽车实现了产品接口的行为,代表具体的实现类。
工厂类(CarFactory
):
静态工厂方法 create_car
负责根据输入参数决定具体创建哪种汽车。
客户端:
客户端代码通过调用 CarFactory
的工厂方法获取需要的产品,而不是直接实例化具体的产品类。
例如,用字典改写工厂逻辑:
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 中是一种创建对象的标准做法,适合需要解耦产品使用与创建逻辑的场景。通过合理的工厂模式设计,系统可以保持开闭原则的高扩展性,同时满足软件架构的设计需求。
观察者模式是一种行为设计模式,能够定义一种一对多的依赖关系。当一个对象的状态发生改变时,会自动通知依赖于它的其它对象,并自动更新(使观察者保持同步)。它是一种松耦合的设计方式,发布者(Subject)和订阅者(Observers)之间不直接依赖彼此的实现。
观察者模式在需要事件驱动的系统中广泛应用,比如 UI 系统、事件通知、日志系统、定制化消息广播等。
观察者模式的结构一般分为以下几个主要角色:
Subject(被观察者/主题)
被观察的对象,提供管理观察者的方法(添加、删除),并负责在自己的状态发生变化时通知所有观察者。
Observer(观察者)
观察对象的接口,定义具体观察者收到通知时的操作行为。
ConcreteSubject(具体主题)
被观察者的具体实现类,继承并实现了 Subject
接口,维护其自身状态并通知观察者。
ConcreteObserver(具体观察者)
具体实现 Observer
接口的类,响应 ConcreteSubject
发出的通知。
GUI系统中的事件处理
当用户操作(如点击按钮、输入文本)时,需要通知多个组件以更新其状态。
订阅-发布系统
比如使用者订阅特定话题,当消息发布时所有订阅者都收到通知。
MVC 模式
在模型(Model)和视图(View)之间,用观察者模式保持视图数据和模型同步。
游戏引擎中的事件系统
游戏角色的血量变化通知 UI 界面更新。
松耦合
观察者和主题之间耦合性较低,便于扩展和复用。
灵活性
可以动态添加、移除观察者,动态调整系统的行为。
多目标同步
一个主题可以同步通知多个观察者。
性能问题
如果有大量观察者且频繁通知,可能带来性能开销(CPU 消耗较大)。
调试复杂性
当有多个观察者被调用时,可能会引入难以调试的问题,特别是在观察者链条较长或有循环依赖的情况下。
以下我们通过一个股票市场通知系统来展示观察者模式的实现。在这个系统中,StockMarket
是被观察对象,当股价变化时,会通知所有的投资者(观察者)。
#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
核心逻辑
StockMarket
是被观察者(Subject),它维护了一个观察者的列表,当股价变化时调用 notify()
来通知所有注册的观察者。
动态绑定
观察者通过抽象类 Observer
实现,体现了多态机制,不同的观察者可以实现特定的通知处理逻辑。
动态管理观察者
可以通过 attach()
和 detach()
在运行时增加或移除观察者。
观察者模式的实现简单且强大,特别适合需要扩展性强的通知系统。但也要慎用,否则会因过度通知、链式依赖等导致系统复杂性提升。
从事系统开发的程序员,使用提示词快速掌握设计模式理论,学习代码实现,并将其用于项目开发。
想提升团队架构能力的技术领袖,利用本提示词快速生成教学材料并推广设计模式知识,使团队开发更高效。
从事技术教程、博客、书籍撰写的内容创作者,通过提示词快速建立高质量架构文章模板,提高创作效率。
帮助用户深入理解并掌握指定设计模式的用途、结构及实现方法,通过清晰的讲解和实例代码提升技术技能,从而解决实际开发中的架构问题,并在项目实施中充分运用到设计模式的核心思想。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期