Bootstrap

什么是设计模式以及常见的例子(如单例、工厂、观察者等)

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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;