【软考】23种设计模式详解,记忆方式,并举例说明

【软考】23种设计模式详解,记忆方式,并举例说明

23种设计模式详解,举例说明

一、创建型模式

1.1、抽象工厂模式(Abstract Factory)

1.1.1、简介

1.1.2、意图与应用场景

1.1.3、结构

1.1.4、优缺点

1.1.4、示例代码(简化版)

1.2、建造者模式(Builder)

1.2.1、简介

1.2.2、意图与应用场景

1.2.3、结构

1.2.4、优缺点

1.2.5、示例代码(简化版)

1.3、原型模式(Prototype)

1.3.1、简介

1.3.2、结构

1.3.3、工作原理和应用场景

1.3.4、优缺点

1.4.5、示例代码

1.4、工厂方法模式(Factory Method)

1.4.1、简介

1.4.2、意图与应用场景

1.4.3、结构

1.4.4、工作流程

1.4.5、示例代码(简化版)

1.5、单例模式(Singleton)

1.5.1、简介

1.5.2、意图与应用场景

1.5.3、结构

1.5.4、工作流程

1.5.5、优缺点

1.5.6、示例代码(简化版)

二、结构型模式

2.1、代理模式(Proxy)

2.2、享元模式(Flyweight)

2.3、外观模式(Facade)

2.4、适配器模式(Adapter)

2.5、组合模式(Composite)

2.6、桥接模式(Bridge)

2.7、装饰器模式(Decorator)

三、行为型模式

3.1、访问者模式(Visitor)

3.2、观察者模式(Observer)

3.3、备忘录模式(Memento)

3.4、状态模式(State)

3.5、模板方法模式(Template Method)

3.6、责任链模式(Chain of Responsibility)

3.7、命令模式(Command)

3.8、中介者模式(Mediator)

3.9、解释器模式(Interpreter)

3.10、迭代器模式(Iterator)

3.11、策略模式(Strategy)

一、创建型模式

这类模式提供了对象创建机制,增加了程序的灵活性和复用性。记忆方法:想见员工丹。

1.1、抽象工厂模式(Abstract Factory)

1.1.1、简介

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式是工厂方法模式的一种扩展,它用于处理多维度的大规模产品族,而不是单一产品的创建问题。

抽象工厂模式可以想象成一个大型工厂,这个大工厂里有好几个小工厂,每个小工厂负责生产一系列相关的产品。这种设计模式的核心就是帮助我们在不直接指定具体类的情况下创建一系列相关或依赖对象。 . 来个更生活化的比喻:假设你现在要装修一个新房子,你需要一套家具,包括沙发、咖啡桌和电视柜。你当然希望这些家具风格相配,要么是现代简约风,要么是经典欧式风,而不是混搭风。 . 如果用抽象工厂模式来解决这个问题,那么“家具工厂”就是一个“抽象工厂”,它能够提供一系列相关的产品:沙发、咖啡桌、电视柜。而具体生产这些家具的,则是它下面的“具体工厂”,比如“现代简约风家具工厂”和“经典欧式风家具工厂”。你只需要告诉它,我需要一套“现代简约风”的家具,剩下的事情就交给它去做,它会给你一套风格统一的家具。

1.1.2、意图与应用场景

抽象工厂模式主要用于以下情景:

当需要创建的对象是一系列相互关联或相互依赖的产品族时。

当系统中的产品有多于一个的产品系列,而系统只消费其中某一系列的产品时。

当系统需要提供一个产品类库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

1.1.3、结构

抽象工厂模式通常包含以下几个角色:

抽象工厂(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

具体工厂(Concrete Factory):实现抽象工厂的操作,创建具体的产品对象。

抽象产品(Abstract Product):为一类产品对象声明一个接口。

具体产品(Concrete Product):定义一个将被相应的具体工厂创建的产品对象,实现抽象产品接口。

客户端(Client):仅使用由抽象工厂和抽象产品定义的接口。

1.1.4、优缺点

优点

隔离具体类的生成:客户端不需要知道它所创建的对象的类。客户端只需要知道具体工厂的接口即可。

易于交换产品系列:因为具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得非常容易。

促进产品系列的一致性:在一个系列的产品对象被设计成一起工作时,它能保证客户端始终只使用同一个产品系列中的对象。

缺点

难以支持新种类的产品:扩展抽象工厂以包含新产品的功能是困难的。这是因为抽象工厂接口确定了可以被创建的产品集合,支持新种类的产品需要扩展工厂接口,这将涉及到抽象工厂类及其所有子类的改变。

1.1.4、示例代码(简化版)

以下是一个简化的抽象工厂模式示例,展示了如何创建两种不同的UI组件族:Light 和 Dark。

// 抽象产品:按钮

interface Button {

void paint();

}

// 具体产品:浅色按钮

class LightButton implements Button {

public void paint() {

System.out.println("Rendering light button");

}

}

// 具体产品:深色按钮

class DarkButton implements Button {

public void paint() {

System.out.println("Rendering dark button");

}

}

// 抽象工厂

interface GUIFactory {

Button createButton();

}

// 具体工厂:创建浅色UI组件

class LightGUIFactory implements GUIFactory {

public Button createButton() {

return new LightButton();

}

}

// 具体工厂:创建深色UI组件

class DarkGUIFactory implements GUIFactory {

public Button createButton() {

return new DarkButton();

}

}

客户端代码

public class Client {

private Button button;

public Client(GUIFactory factory) {

button = factory.createButton();

}

public void paint() {

button.paint();

}

public static void main(String[] args) {

// 使用浅色主题

GUIFactory lightFactory = new LightGUIFactory();

Client client1 = new Client(lightFactory);

client1.paint();

// 使用深色主题

GUIFactory darkFactory = new DarkGUIFactory();

Client client2 = new Client(darkFactory);

client2.paint();

}

}

在这个例子中,GUIFactory 是一个抽象工厂,它有两个具体的实现:LightGUIFactory 和 DarkGUIFactory,分别用于创建浅色和深色主题的按钮。客户端代码不直接实例化产品对象,而是通过工厂接口,这使得添加新的产品族或更改产品族变得容易,且客户端代码不需要改变。

1.2、建造者模式(Bui

📌 相关推荐