设计模式之禅
[TOC]
第二部分 23种设计模式- 创建类模式
创建类模式: 使软件模块做到与对象的创建和组织无关
一.单例模式
定义
确保某一个类只有一个实例,并自省实例化向整个系统提供这个实例
缺点
- 一般没有接口,扩展很困难。除了修改代码基本没有第二种途径
- 对测试不利
- 与单一职责原则有冲突
扩展
- 懒汉式、饿汉式
- 带固定数量的单例
二.工厂方法模式
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类
优点
降低模块间耦合,一个调用者需要一个具体的产品对象,只要知道这个产品的类名就可以了,不用知道创建对象的艰辛过程
扩展
简单工厂模式
工厂类没有抽象类或接口(使用static方法调用),产品有通用的接口。通过提供标识让工厂生产类图**
工厂方法模式(每个产品提供对应的创建者)
工厂类有抽象类或接口, 需要创建出工厂后调用类图
替代单例模式
单例的类不提供静态方法创建实例,通过工厂的静态方法来创建(通过反射)类图
延迟初始化: 一个对象被消费完毕后,并不立刻释放,工厂类保持初始状态,等待再次被使用
- 应用场景: 限制某个产品类的最大实例化数量 JDBC设置的最大连接数量…
- 类图
三.抽象工厂模式
1.定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体实现类
2.类图
工厂方法模式的升级版本。在有多个业务品种、业务分类时,是一种很好的解决方式
3.优点
- 封装性
- 产品族内的约束为非公开的
4.缺点
横向扩展容易,但纵向扩展困难
比较 简单工厂、工厂方法、抽象工厂
- 简单工厂: 没有工厂接口,需要什么产品,对应传入标识,获得
- 工厂方法: 含有工厂接口(接口内就一个生产方法),分类后,只管生产分类所对应的单一商品,不用传入标识。如: 人类工厂划分为黄人、黑人、白人工厂,黄人工厂只生产黄人
- 抽象工厂: 含有工厂接口(接口内有多个生产方法),分类后,只管生产分类的一系列商品,不用传入标识。如: 人类工厂划分为黄人、黑人、白人工厂,黄人工厂只生产黄人男人、黄人女人
四.建造者模式(生成器模式)
1.定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2.类图
3.角色
Product 产品类
通常是实现了模版方法模式,也就是有模版方法和基本方法Builder 抽象建造者
规范产品的组建,一般由子类实现ConcreteBuilder 具体建造者
实现抽象类定义的所有方法,并返回一个组建好的对象Director 导演类
负责安排已有模块的顺序,然后告诉Build开始组件。起到封装的作用,避免高层模块深入到建造者内部的实现类
4.优点
- 封装性
- 建造者独立,容易扩展
- 便于控制细节风险
5.使用场景
- 不同的执行顺序,产生不同的事件结果
- 多个零件或部件
工厂方法模式,关注的重点是创建,创建零件
建造者模式,关注的重点是零件的装配,顺序不同产生的对象也不同
五.原型模式
1.定义
用原型实例指定创建对象的种类,并且拷贝这些原型创建对象
2.类图
3.使用
实体类实现cloneable接口,重写clone方法
- 浅拷贝
直接通过Object的clone方法进行拷贝,只拷贝本对象,对象内部的数组、引用对象都不拷贝,指向原生对象的内部元素地址。(在这里String可以当作基本类型使用)
- 深拷贝
对私有的类变量进行独立的拷贝
4.优点
- 性能优良
- 逃避构造函数的约束
5.使用场景
- 资源优化场景
- 性能和安全要求
- 一个对象多个修改者的场景
要使用clone方法,在类的成员变量上就不要增加final关键字