创建型设计模式

简介: 创建型设计模式

计模式

设计模式代码地址
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(实现了抽象产品角色所定义的接口)
  • 抽象工厂模式优缺点
  • 优点:
  • 内部存在约束,.
  • 对于等级的拓展十分容易(符合开闭原则),而对于产品的新增十分困难(需要修改所有具体工厂).
  • 与具体类分开
  • 更容易在产品类中转换
  • 提高了产品见的一致性
  • 缺点:当一个抽象工厂需要引入创建一个新的产品时,则基于抽象工厂的所有具体工厂类都需要进行修改. 因此使用抽象工厂最需要关注的则是需要创建的产品的种类个数.
  • 工厂模式的总结
  • 抽象程度:简单工厂-》方法工厂-》抽象工厂(抽象程度依次递增)
  • 简单工厂通过条件来条件来创建对象,不符合开闭原则;方法工厂对其进行了抽象,使其在不需要改变工厂的代码的情况下进行对象的创建,符合开闭原则; 而方法工厂对于对象的创建,只能创建同种类的产品.而抽象工厂则对其进行了进一步的抽象,使其能够创建不同种类同一等级的产品.
  • 工厂模式与构建者模式的区别
  • 从视角方面出发
  • 工厂在乎的是部件的创建
  • 构建者在乎的是部件组装过程
目录
相关文章
|
7月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
36 5
|
8月前
|
设计模式 搜索推荐 数据库连接
第二篇 创建型设计模式 - 灵活、解耦的创建机制
第二篇 创建型设计模式 - 灵活、解耦的创建机制
|
7月前
|
设计模式 Oracle Java
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。
【6月更文挑战第20天】工厂模式简化对象创建,根据参数或条件生成MySQL或Oracle数据库连接。`DatabaseConnectionFactory`作为工厂,动态返回具体连接类型。装饰器模式则用于运行时动态增加对象功能,如`LoggingDecorator`为`Runnable`对象添加日志记录,保持代码整洁。在`Main`类中展示了如何使用这两种模式。
44 6
|
7月前
|
设计模式
创建型设计模式之建造者模式
创建型设计模式之建造者模式
|
8月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~ 原型模式
[设计模式 Go实现] 创建型~ 原型模式
|
8月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~工厂方法模式
[设计模式 Go实现] 创建型~工厂方法模式
|
8月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~建造者模式
[设计模式 Go实现] 创建型~建造者模式
|
8月前
|
设计模式 JavaScript 前端开发
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
|
8月前
|
设计模式 缓存 架构师
创建型设计模式的比较与决策
本文深入探讨六种创建型设计模式:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。通过概述各模式的核心概念、应用场景和关键要素,帮助读者理解并掌握这些模式的核心思想。文章还通过比较表和决策流程图,直观地展示了各模式之间的差异和选择依据,为读者提供了实用的设计模式选择指南。 本文的特色在于结合了理论与实践,每个模式都配有详细的代码示例和结构图,帮助读者更好地理解和应用这些模式。 总之,本文旨在为读者提供一篇全面、深入且实用的创建型设计模式指南,帮助读者在实际工作中灵活运用这些模式...
159 0
创建型设计模式的比较与决策
|
8月前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式
[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式