创建型设计模式总结
前言
创建型设计模式总结。
单例模式(Singleton)
别名:
- 单件模式
描述:
- 保证一个类仅有一个实例,并提供一个访问它的全局访问点
结构:
- 单例类
概述:
- 单例类:私有静态单例类对象
- 单例类:私有构造方法
- 单例类:公有静态获取单例类对象方法
- 公有静态获取单例类对象方法:判断是否存在私有静态单例类对象,若是则返回该对象;若无则调用私有构造方法创建再返回对象
- 客户端:调用单例类的公有静态获取单例类对象方法获得单例类对象
核心:
- 私有静态单例类对象
- 私有构造方法
- 公有静态获取单例类对象方法
类型:
- 饿汉式:单例类编译时创建单例类对象(不管用不用都提前创建)。线程安全
- 懒汉式:程序运行时创建单例类对象(用了才创建)。线程不安全,需要双重锁定
简单工厂模式(Simple Factory)
结构:
- 抽象产品类/接口
- 具体产品类——与抽象产品类/接口是继承/实现关系
- 简单工厂类——与抽象产品类是依赖关系
注意:
- 抽象类/继承和接口/实现在一定程度上可相互转换代替
- 抽象类:抽象对象,对象之间有关系,属于同一类,可继承:如鸟和雁
- 接口:抽象行为,对象之间无关系,有共同的行为:如鸟和飞机,都会飞
- 该系列博客不再区分抽象类和接口、抽象方法和虚方法的用词
概述:
- 抽象产品类:抽象/虚方法
- 具体产品类:重写抽象产品类的抽象方法为具体方法
- 简单工厂类:静态方法创建抽象产品类类型的具体产品类对象
- 客户端:调用简单工厂类的静态方法创建抽象产品类类型的具体产品类对象,使用抽象产品类类型的具体产品类对象调用具体产品类的具体方法
核心:
- 继承
- 多态
- 静态方法创建对象
面向对象三大特性的体现:
- 封装:类
- 继承:具体产品类——与抽象产品类是继承关系
- 多态:具体产品类:重写抽象产品类的抽象方法为具体方法、抽象产品类类型的具体产品类对象调用具体产品类的具体方法
- 该系列博客不再描述面向对象三大特性的体现
其他:
- 简单工厂模式属于设计模式,不属于23种GoF设计模式之一,因为违背开放-封闭原则,扩展需要修改简单工厂类:增加创建产品类对象逻辑判断、创建代码
工厂方法模式(Factory Method)
别名:
- 虚拟构造函数模式(Virtual Constructor)
描述:
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
结构:
- 抽象产品类
- 具体产品类——与抽象产品类是继承关系
- 抽象创建者类/接口——与抽象产品类是依赖关系
- 具体创建者类——与抽象创建者类是继承关系
概述:
- 抽象产品类:抽象方法
- 具体产品类:重写抽象产品类的抽象方法为具体方法
- 抽象创建者类:抽象方法
- 具体创建者类:重写抽象创建者类的抽象方法为具体方法
- 具体创建者类的具体方法:创建抽象产品类类型的具体产品类对象
- 客户端:创建抽象创建者类类型的具体创建者类对象,调用抽象创建者类类型的具体创建者类对象的具体方法创建抽象产品类类型的具体产品类对象,调用抽象产品类类型的具体产品类对象的具体方法
核心:
- 继承
- 多态
- 创建抽象类类型的具体类对象:创建者类对象和产品类对象
简单工厂模式和工厂方法模式的区别:
- 简单工厂模式:在简单工厂类的静态方法逻辑判断,创建产品类对象
- 工厂方法模式:在客户端逻辑判断,创建工厂类对象,再创建产品类对象
- 工厂方法模式克服简单工厂模式的缺陷:违背开放-封闭原则。扩展需要增加具体工厂类
抽象工厂模式(Abstract Factory)
描述:
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
结构:
- 抽象产品类(一个或多个)
- 具体产品类(一个或多个)——与抽象产品类是继承关系
- 抽象工厂类
- 具体工厂类——与抽象工厂类是继承关系,与具体产品类是依赖关系
概述:
- 抽象产品类:抽象方法。多个抽象产品类有多种不同的实现:如桌子和椅子
- 具体产品类:重写抽象产品类的抽象方法为具体方法。多个具体产品类有多种不同的实现:如桌面和桌腿
- 抽象工厂类:抽象方法
- 具体工厂类:重写抽象工厂类的抽象方法为具体方法
- 具体工厂类的具体方法:能够创建“性质/风格/系列”相同,种类不同的产品:如维多利亚风格和现代风格
- 客户端:创建抽象工厂类类型的具体工厂类对象,调用抽象工厂类类型的具体工厂类对象的具体工厂类方法创建抽象产品类类型的具体产品类对象
核心:
- 二维以上结构:维多利亚风格工厂创建维多利亚风格的桌子的桌面和桌腿产品,现代风格工厂创建现代风格的桌子的桌面和桌腿产品,椅子同理。维度:产品风格,产品类型
- 继承
- 多态
- 创建具体工厂类对象,创建具体产品类对象
抽象工厂模式和简单工厂模式、工厂方法模式的区别:
- 多维结构
- 创建一个具体工厂类对象,可创建多个同系列不同种类的具体产品类对象
原型模式(Prototype)
别名:
- 克隆模式(Clone)
描述:
- 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
结构:
- 抽象原型类
- 具体原型类——与抽象原型类是继承关系——被克隆者/原型、克隆者
概述:
- 抽象原型类:抽象克隆方法
- 具体原型类:重写抽象原型类的抽象克隆方法为具体克隆方法
- 具体克隆方法:创建并返回抽象原型类类型的当前具体原型类对象的副本
- 客户端:创建具体原型类对象——被克隆者,具体原型类对象调用具体原型类的具体克隆方法创建的具体原型类对象——克隆者
核心:
- 继承
- 多态
- 原型类的克隆方法创建并返回原型类对象的副本
其他:
- 注意克隆方法中的浅拷贝和深拷贝问题
建造者模式(Builder)
别名:
- 生成器模式
描述:
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
结构:
- 产品类
- 抽象建造者类
- 具体建造者类——与抽象建造者类是继承关系,与产品类是依赖关系
- 指挥者类——与抽象建造者类是聚合关系
概述:
- 产品类:方法
- 抽象建造者类:抽象建造方法和抽象获取产品方法
- 具体建造者类:产品类对象
- 具体建造者类:重写抽象建造者类的抽象建造方法和抽象获取产品方法为具体建造方法和具体获取产品方法
- 具体建造方法:产品类对象调用产品类的方法
- 具体获取产品方法:返回产品类对象
- 指挥者类:通过方法设置并持有抽象建造者类类型的具体建造者类对象、抽象建造者类类型的具体建造者类对象调用具体建造者类的具体建造方法
- 客户端:创建抽象建造者类类型的具体建造者类对象,将抽象建造者类类型的具体建造者类对象作为参数创建指挥者类对象,指挥者类对象调用指挥者类方法——建造过程,抽象建造者类类型的具体建造者类对象调用具体获取产品方法——建造结果
核心:
- 继承
- 多态
- 创建建造者类对象,再创建指挥者类对象,指挥者类对象调用指挥者类方法——建造过程,具体建造者类对象调用具体获取产品方法——建造结果
- 建造者类封装产品的各个建造细节:如建造桌面和建造桌腿;指挥者类封装建造过程的内容和时序:如建造桌子总要建造桌面和桌腿,先建造桌面后建造桌腿;建造过程:调用指挥者类的方法,建造结果:调用产品类的方法——分离创建和表示逻辑
记忆
- 单例模式(Singleton):简单
- 简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory):三工厂
- 原型模式(Prototype):克隆
- 建造者模式(Builder):分离创建和表示逻辑
总结
创建型设计模式总结。
参考资料
- 《大话设计模式》作者:程杰
- 常用设计模式有哪些? (refactoringguru.cn)
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 夜悊的技术小宅!