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