设计模式的梳理与实现
原则一:针对接口编程,而不是针对实现编程。(只根据抽象类中定义的接口来操纵对象,客户无需知道他们使用对象的特定类型,只需对象有客户所期望的接口。)
原则二:优先使用对象组合,而不是类继承。
本文尝试用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