关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

创建型设计模式

发布时间:2023-06-26 12:00:38

计模式

设计模式代码地址
https://gitee.com/BeliveLove/source-code/tree/master/src/main/java/com/example/demo/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%88%9B%E5%BB%BA%E5%9E%8B%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F

创建型设计模式

建造者模式

  • 定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
  • 创建者模式结构图
    • 产品角色(HomeWork):包含多个组成部件的复杂对象
    • 抽象建造者(HomeworkBuilder):包含创建产品各个子部件的抽象方法
    • 具体建造者(ConCreateBuilder):实现了抽象建造者接口
    • 指挥者(Director):调用建造者中的方法完成复杂对象的组装。
  • 建造者模式优点、缺点
    • 优点:
      • 部件与表示分离
      • 建造者相互独立,有利于扩展
    • 缺点:
      • 如果产品部件很多,那么指挥者将会很臃肿
      • 产品的部件必须一样,如果产品发生变化,则将会涉及到多个类的变化,维护十分困难
  • PS:我不喜欢用指挥者,因为如果部件过多,那么排列组合将会很恐怖

原型模式

  • 定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
  • 原型模式结构图
    • 抽象原型类(Cloneable):规定了具体原型对象必须实现的接口。
    • 具体原型类(ConCreatePrototype):实现抽象原型类的 clone() 方法,它是可被复制的对象。
    • 访问类:使用具体原型类中的 clone() 方法来复制新的对象。
    • 实现Cloneable接口的拷贝为浅拷贝
      • 浅拷贝:具体原型类中的Clone仅拷贝对象本身以及对象本身的基本变量
  • 原型模式的优点、缺点
    • 优点:
      • 相对于直接new,性能更好
      • 深克隆可以保持状态,能够做撤销操作
    • 缺点:
      • 每个需要clone的类都需要实现clone方法
      • clone方法位于类内部,如果需要对已有的类进行修改,违反了开闭原则
      • 深拷贝实现困难

单例模式

  • 定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
  • 单例模式结构图
    • LazySingleton(懒汉式单例模式):默认不创建对象, 当第一次使用时加载对象,多线程操作时,需要注意数据的安全性, 可使用volatile,synchronized关键字保证数据安全,但是每次都进行数据安全验证会导致性能下降
    • HungrySingleton(饿汉式单例模式):默认创建对象,不需要进行数据安全性验证
    • ExpandSingleton(有限多单例模式):默认创建特定数量的单例,使用时从单例池中随机获取

工厂模式

  • 定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。

简单工厂模式

  • 简单工厂方法结构图
    • 简单工厂类:MaskFactory(承载了创建对象的核心逻辑)
    • 抽象产品类:IMask(定制了所有产品的规则,是所有产品的基类)
    • 具体产品类:LowEndMask,HighEndMask
  • 简单工厂模式的优缺点
    • 优点
      • 工厂类包含了创建对象的逻辑,可以决定什么时候创建对象
      • 客户无需知道具体产品的标识符,只需要知道条件参数就行
    • 缺点
      • 工厂类的职责过于重,一旦发生异常,整个工厂都将受到影响
      • 一旦需要创建心得对象,需要修改工厂类的逻辑,不易于拓展

工厂方法模式

  • 工厂方法结构图
    • 抽象工厂类:AbstractFactory(定义类创建产品的抽象方法)
    • 具体工厂类:ConCreateProductAFactory,ConCreateProductBFactory (定义了同一产品不同的等级实现,完成具体产品的创建,实现了AbstractFactory抽象方法)
    • 抽象产品类:Product(定义了产品的规范,描述了产品的主要特性和功能)
    • 产品类:ProductA,ProductB(产品的具体实现)
  • 工厂方法模式的优缺点
    • 优点
      • 只需要知道具体工厂的名称就能获得对象,不需要知道具体细节
      • 对于多产品的创建,只需要创建多个工厂
      • 高层模块不需要知道其具体实现类,只需要知道产品的抽象类
    • 缺点
      • 类的数量容易过多,
      • 系统的抽象程度,难以理解
      • 只能生产同一种产品

抽象工厂模式

  • 抽象工厂模式结构图
    • 抽象工厂类:AbstractFactory (提供了同时只能使用同一等级的产品创建产品的接口,它包含多个创建产品的方法 Create(),可以创建多个不同等级的产品.)
    • 具体工厂类:LowEndFactory,LowEndFactory (主要是实现抽象工厂中的多个抽象方法,完成同一产品不同级别的创建.)
    • 抽象产品:CreateIMask,CreateIProtectiveSuit (定义了产品的规范,抽象工厂模式有多个抽象产品)
    • 具体产品:HighEndMaskCreate,HighEndProtectiveSuitCreate, LowEndMaskCreate,LowEndProtectiveSuitCreate(实现了抽象产品角色所定义的接口)
  • 抽象工厂模式优缺点
    • 优点:
      • 内部存在约束,.
      • 对于等级的拓展十分容易(符合开闭原则),而对于产品的新增十分困难(需要修改所有具体工厂).
      • 与具体类分开
      • 更容易在产品类中转换
      • 提高了产品见的一致性
    • 缺点:当一个抽象工厂需要引入创建一个新的产品时,则基于抽象工厂的所有具体工厂类都需要进行修改. 因此使用抽象工厂最需要关注的则是需要创建的产品的种类个数.
  • 工厂模式的总结
    • 抽象程度:简单工厂-》方法工厂-》抽象工厂(抽象程度依次递增)
    • 简单工厂通过条件来条件来创建对象,不符合开闭原则;方法工厂对其进行了抽象,使其在不需要改变工厂的代码的情况下进行对象的创建,符合开闭原则; 而方法工厂对于对象的创建,只能创建同种类的产品.而抽象工厂则对其进行了进一步的抽象,使其能够创建不同种类同一等级的产品.
  • 工厂模式与构建者模式的区别
    • 从视角方面出发
      • 工厂在乎的是部件的创建
      • 构建者在乎的是部件组装过程

/template/Home/leiyu/PC/Static