- 01.创建型模式
- 02.包含模式
- 03.解决什么问题
- 04.简单介绍
- 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。
- 为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。
- 创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
- 分类
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 建造者模式(Builder)
- 原型模式(Prototype)
- 单例模式(Singleton)
- 常见的有
- 主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。
- 单例模式用来创建全局唯一的对象。
- 一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。
- 单例有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举。
- 有些人认为单例是一种反模式(anti-pattern),并不推荐使用,主要的理由有以下几点:
- 单例对 OOP 特性的支持不友好
- 单例会隐藏类之间的依赖关系
- 单例对代码的扩展性不友好
- 单例对代码的可测试性不友好
- 单例不支持有参数的构造函数
- 工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
- 实际上,如果创建对象的逻辑并不复杂,那我们直接通过 new 来创建对象就可以了,不需要使用工厂模式。当创建逻辑比较复杂,是一个“大工程”的时候,就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。
- 当每个对象的创建逻辑都比较简单的时候,推荐使用简单工厂模式,将多个对象的创建逻辑放到一个工厂类中。
- 当每个对象的创建逻辑都比较复杂的时候,为了避免设计一个过于庞大的工厂类,我们推荐使用工厂方法模式,将创建逻辑拆分得更细,每个对象的创建逻辑独立到各自的工厂类中。
- 详细点说,工厂模式的作用有下面4个,这也是判断要不要使用工厂模式最本质的参考标准。
- 封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。
- 代码复用:创建代码抽离到独立的工厂类之后可以复用。
- 隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
- 控制复杂度:将创建代码抽离出来,让原本的函数或类职责更单一,代码更简洁。
- 建造者模式由来
- 存在一些复杂的对象,它们拥有多个组成部分。如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节,可以通过建造者模式对其进行设计与描述。
- 建造者模式定义
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。
- 建造者模式的思考
- 构建复杂对象的实现方案
- 举一个例子,配置资源池,里面的参数有:最大数,最小数,前台线程数,名称,复用池,日志监听,等等。而你需要根据不同的场景配置不同的对象。
- 第一种方案:通过new构造函数去创建对象,比如通过4个参数,5个参数,6个参数去构建对象,则需要大量的构造函数,每次改动都不好维护
- 第二种方案:通过new构造对象,然后通过set去设置参数,代码可读性和易用提高,但是set破坏了对象不可变性,违背了对象在创建好之后就不能再修改内部的属性值。
- 第三种方案:通过建造者方式构建对象,一次性构建参数,并且可以统一对参数进行校验,满足了构建复杂对象的场景要求。
- 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同)
- 在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。
- 这种基于原型来创建对象的方式就叫作原型模式。