• 原则一:针对接口编程,而不是针对实现编程。(只根据抽象类中定义的接口来操纵对象,客户无需知道他们使用对象的特定类型,只需对象有客户所期望的接口。)

  • 原则二:优先使用对象组合,而不是类继承。

本文尝试用C++、Python、Go三种语言实现各种常见的设计模式,作为练习和总结。 如果对设计模式不太熟悉的话,可以阅读《图说设计模式》一文。

1.创建型模式

1.1 简单工厂模式(Simple Factory)

角色:

  • 产品抽象类Product
  • 产品具体类ConcreteProductA, ConcreteProductB
  • 工厂类Factory:根据参数不同,返回不同的产品对象

引进新产品时,需要修改工厂类。

1.2工厂方法模式(Factory Method)

角色:

  • 产品抽象类Product
  • 产品具体类ConcreteProductA, ConcreteProductB
  • 工厂抽象类Factory
  • 工厂具体类ConcreteFactoryA, ConcreteFactoryB:负责各自产品的创建

引入新产品时,不需要修改工厂类,而是需要实现一个与新产品相对应的工厂类的子类。

1.3 抽象工厂模式(Abstract Factory)

首先要明确,多种类产品之间是有逻辑关系的:

(1)有等级关系:电视机 -> TCL电视机、海信电视机、创维电视机;冰箱 -> TCL 冰箱、海信冰箱、创维冰箱

(2)有产品族关系:同一工厂的产品属于同一产品族。

在此前提下,考虑抽象工厂模式。

角色:

  • 产品抽象类ProductTV, ProductFreezer
  • 产品具体类ConcreteProductTclTV, ConcreteProductHisenseTV, ConcreteProductTclFreezer, ConcreteProductHisenseFreezer
  • 工厂抽象类Factory
  • 工厂具体类ConcreteFactoryTcl, ConcreteFactoryHisense:负责各自品牌下产品族的创建

应用场景:系统中有多于一个的产品族,而每次只使用其中某一产品族(比如更换界面主题)。

1.4 建造者模式(Builder)

又叫生成器模式。对于复杂对象,要组装各个部件,采用此模式。组装策略不同,可以得到不同的对象。

角色:

  • 产品Product
  • 建造者抽象类Builder(成员变量中有Product的实例)
  • 建造者具体类BuilderA, BuilderB(实现建造过程)
  • 指挥者Director(指挥者类中,保存Builder基类的指针)

1.5 原型模式(Prototype)

重要程度:3

1.6 单例模式(Singleton)

让类自身负责保存它的唯一实例。

2.结构型模式

结构型模式描述如何将类或者对象结合在一起形成更大的结构,分为类结构型模式和对象结构型模式。

2.1 适配器模式(Adapter)

2.1.1 类适配器

角色:

  • 适配的目标Target类(该类有request方法,视为接口定义)
  • 已存在的接口Ataptee类(该类只有specificRequest方法,不满足Target的接口要求)
  • 适配器Adapter类(该类继承自Adaptee类,并且通过包装Adaptee的方法来实现Target中需要的接口)

2.1.2 对象适配器

角色:

  • 适配的目标Target类(该类有request方法,视为接口定义)
  • 已存在的接口Ataptee类(该类只有specificRequest方法,不满足Target的接口要求)
  • 适配器Adapter类(该类包含一个Adaptee的实例作为成员变量,并且实现了Target中需要的接口)

2.2 桥接模式(Bridge)

重要程度:3

2.3 组合模式(Composite)

重要程度:4

2.4 装饰模式(Decorator)

重要程度:3

2.5 外观模式(Facade)

重要程度:5

2.6 享元模式(Flyweight)

重要程度:1

2.7 代理模式(Proxy)

重要程度:4

3.行为型模式

3.1 命令模式(Command)

3.2 中介者模式(Mediator)

3.3 观察者模式(Observer)

3.4 状态模式(State)

3.5 策略模式(Strategy)