《设计模式之禅》 创建类模式

设计模式之禅

[TOC]

第二部分 23种设计模式- 创建类模式

创建类模式: 使软件模块做到与对象的创建和组织无关

一.单例模式

定义

确保某一个类只有一个实例,并自省实例化向整个系统提供这个实例

缺点

  1. 一般没有接口,扩展很困难。除了修改代码基本没有第二种途径
  2. 对测试不利
  3. 与单一职责原则有冲突

扩展

  1. 懒汉式、饿汉式
  2. 带固定数量的单例

二.工厂方法模式

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类

优点

降低模块间耦合,一个调用者需要一个具体的产品对象,只要知道这个产品的类名就可以了,不用知道创建对象的艰辛过程

扩展

  1. 简单工厂模式
    工厂类没有抽象类或接口(使用static方法调用),产品有通用的接口。通过提供标识让工厂生产

    类图**

    1573999817681

  2. 工厂方法模式(每个产品提供对应的创建者)
    工厂类有抽象类或接口, 需要创建出工厂后调用

    类图

    1573999855220

  3. 替代单例模式
    单例的类不提供静态方法创建实例,通过工厂的静态方法来创建(通过反射)

    类图

    1573999897554

  4. 延迟初始化: 一个对象被消费完毕后,并不立刻释放,工厂类保持初始状态,等待再次被使用

    • 应用场景: 限制某个产品类的最大实例化数量 JDBC设置的最大连接数量…
    • 类图
      1573999949429

三.抽象工厂模式

1.定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体实现类

2.类图

1574075965522

工厂方法模式的升级版本。在有多个业务品种、业务分类时,是一种很好的解决方式

3.优点

  1. 封装性
  2. 产品族内的约束为非公开的

4.缺点

横向扩展容易,但纵向扩展困难

比较 简单工厂、工厂方法、抽象工厂

  • 简单工厂: 没有工厂接口,需要什么产品,对应传入标识,获得
  • 工厂方法: 含有工厂接口(接口内就一个生产方法),分类后,只管生产分类所对应的单一商品,不用传入标识。如: 人类工厂划分为黄人、黑人、白人工厂,黄人工厂只生产黄人
  • 抽象工厂: 含有工厂接口(接口内有多个生产方法),分类后,只管生产分类的一系列商品,不用传入标识。如: 人类工厂划分为黄人、黑人、白人工厂,黄人工厂只生产黄人男人、黄人女人

四.建造者模式(生成器模式)

1.定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

2.类图

1574075997337

3.角色

  1. Product 产品类
    通常是实现了模版方法模式,也就是有模版方法和基本方法

  2. Builder 抽象建造者
    规范产品的组建,一般由子类实现

  3. ConcreteBuilder 具体建造者
    实现抽象类定义的所有方法,并返回一个组建好的对象

  4. Director 导演类
    负责安排已有模块的顺序,然后告诉Build开始组件。起到封装的作用,避免高层模块深入到建造者内部的实现类

4.优点

  1. 封装性
  2. 建造者独立,容易扩展
  3. 便于控制细节风险

5.使用场景

  1. 不同的执行顺序,产生不同的事件结果
  2. 多个零件或部件

工厂方法模式,关注的重点是创建,创建零件
建造者模式,关注的重点是零件的装配,顺序不同产生的对象也不同

五.原型模式

1.定义

用原型实例指定创建对象的种类,并且拷贝这些原型创建对象

2.类图

1574076013656

3.使用

实体类实现cloneable接口,重写clone方法

  • 浅拷贝
    image-20191219115531616

直接通过Object的clone方法进行拷贝,只拷贝本对象,对象内部的数组、引用对象都不拷贝,指向原生对象的内部元素地址。(在这里String可以当作基本类型使用)

  • 深拷贝
    image-20191219115623065

对私有的类变量进行独立的拷贝

4.优点

  1. 性能优良
  2. 逃避构造函数的约束

5.使用场景

  1. 资源优化场景
  2. 性能和安全要求
  3. 一个对象多个修改者的场景

要使用clone方法,在类的成员变量上就不要增加final关键字

0%