设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的主要目的是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式一般包含模式名称、问题、目的、解决方案、效果等基本要素。
设计模式根据目的(即模式是用来做什么的)可以分为三大类:创建型模式、结构型模式和行为型模式。下面分别给出几个常见的设计模式例子,包括单例模式、工厂模式和观察者模式。
1. 单例模式(Singleton Pattern)
定义:单例模式确保一个类只有一个实例,并提供一个全局访问点。
核心知识点:
- 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
- 在其内部产生该类的实例化对象,并将其封装成private static类型。
- 定义一个静态方法返回该类的实例。
使用场景:需要确保在整个应用程序中只存在一个实例的情况,如配置管理器、线程池、缓存等。
实现方式:
- 饿汉式:类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
- 懒汉式:类加载时不初始化,在第一次调用getInstance()方法时才进行初始化,但存在线程安全问题,可通过synchronized关键字或双重检查锁定(Double-Check Locking)来解决。
示例代码(懒汉式,双重检查锁定):
cpp复制代码
| class Singleton {  | |
| private:  | |
| Singleton() {} // 私有化构造方法  | |
| static Singleton* instance; // 静态成员变量,指向唯一实例  | |
| static std::mutex mtx; // 静态互斥锁  | |
| public:  | |
| static Singleton* getInstance() {  | |
| if (instance == nullptr) {  | |
| std::lock_guard<std::mutex> lock(mtx); // 加锁  | |
| if (instance == nullptr) {  | |
| instance = new Singleton(); // 创建实例  | |
| }  | |
| }  | |
| return instance;  | |
| }  | |
| // 其他业务方法  | |
| void doSomething() {  | |
| // ...  | |
| }  | |
| };  | |
| // 静态成员变量初始化  | |
| Singleton* Singleton::instance = nullptr;  | |
| std::mutex Singleton::mtx; | 
注意:上述示例代码以C++风格给出,但设计模式本身是跨语言的,C++中实现单例模式可能需要考虑线程安全和资源管理等问题。
2. 工厂模式(Factory Pattern)
定义:工厂模式用于处理对象的创建,它将创建对象的任务委托给子类或专门的工厂类。
常见类型:
- 简单工厂模式:通过一个工厂类根据传入的参数决定创建哪一种类的实例。
- 工厂方法模式:定义一个创建对象的接口,但让子类决定要实例化的类是哪一个。
- 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
使用场景:当需要创建的对象类型较多,且具有共同的接口时;当需要将对象的创建与使用分离,以提高扩展性和可维护性时。
示例代码(工厂方法模式):
java复制代码
| // 产品接口  | |
| interface Product {  | |
| void use();  | |
| }  | |
| // 具体产品类  | |
| class ConcreteProductA implements Product {  | |
| public void use() {  | |
| System.out.println("Product A is being used.");  | |
| }  | |
| }  | |
| class ConcreteProductB implements Product {  | |
| public void use() {  | |
| System.out.println("Product B is being used.");  | |
| }  | |
| }  | |
| // 工厂接口  | |
| interface Factory {  | |
| Product createProduct();  | |
| }  | |
| // 具体工厂类  | |
| class ConcreteFactoryA implements Factory {  | |
| public Product createProduct() {  | |
| return new ConcreteProductA();  | |
| }  | |
| }  | |
| class ConcreteFactoryB implements Factory {  | |
| public Product createProduct() {  | |
| return new ConcreteProductB();  | |
| }  | |
| }  | |
| // 客户端代码  | |
| public class Client {  | |
| public static void main(String[] args) {  | |
| Factory factory = new ConcreteFactoryA();  | |
| Product product = factory.createProduct();  | |
| product.use();  | |
| }  | |
| } | 
3. 观察者模式(Observer Pattern)
定义:观察者模式定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
核心角色:
- Subject(主题):被观察的对象,它维护一组依赖于它的观察者,并提供添加、删除和通知观察者的方法。
- Observer(观察者):依赖于主题的对象,当主题状态发生变化时,观察者会得到通知并进行相应的