设计模式(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(观察者):依赖于主题的对象,当主题状态发生变化时,观察者会得到通知并进行相应的