设计模式总结01–创建型模式
1 单例模式
1.1 设计意图
保证一个类只有一个实例、且提供一个全局的访问点。
1.2 解决问题
实现一个类的全局共享,避免全局使用的类的频繁创建和释放。
1.3 优缺点
优点
减小内存开销、避免重复创建;
缺点
- 设计原则:没有继承、不能扩展
- 子类膨胀:
- 抽象水平:
- 性能方面:
- 代码可读:
2 普通工厂
分为简单工厂和工厂方法,前者工厂没有抽象接口。这里主要讲的工厂方法。
2.1 设计意图
定义一个产品构建的工厂接口、让工厂实现类去实例化产品接口的具体实现类;
2.2 解决问题
解决单个接口的选择问题
2.3 优缺点
优点
隐藏产品子类信息、接口类型与构建分离;
缺点
- 设计原则:
- 子类膨胀:每加一个产品就需要添加一个工厂实现类。
- 抽象水平:
- 性能方面:
- 代码可读:
- 场景局限:
3 抽象工厂
3.1 设计意图
定义一套产品构建的工厂接口、让工厂实现类去实例化具体某套产品;
3.2 解决问题
解决一套接口的选择问题
3.3 优缺点
优点
隐藏产品子类信息、接口类型与构建分离、使用者不关心产品系列的选择细节;
缺点
- 设计原则:当产品系列中类别有所改变,必然要修改工厂接口,违反开闭
- 子类膨胀:每加一套产品就需要添加一个抽象工厂实现类,同样造成子类膨胀
- 抽象水平:
- 性能方面:
- 代码可读:
- 场景局限:
4 建造者
4.1 设计意图
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示;
4.2 解决问题
解决复杂对象由众多子对象组成,子对象的构建太复杂、用传统工厂很难细粒度把控;
4.3 优缺点
优点
建造者独立和易扩展、外部不需要关心组装细节;
缺点
- 设计原则:
- 子类膨胀:如果对象组合子对象的方式众多、必然有众多的建造者子类产生
- 抽象水平:
- 性能方面:
- 代码可读:
- 场景局限:产品必须有组成的共性可提取,例如人由头、躯、四肢组成,但是生物种类繁多、不好抽象构建过程。
5 原型模式
5.1 设计意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;
5.2 解决问题
在运行期建立和删除原型;
解决差异化太大的系列对象的构建过程;
5.3 优缺点
优点
性能高、不要关心具体子类构造函数;
缺点
- 设计原则:每个类需要实现克隆接口,面对祖传代码就必须要修改现有类,违反开闭
- 子类膨胀:
- 抽象水平:
- 性能方面:
- 代码可读:
- 场景局限:如果对象组合关系有相互持有、甚至环形持有,不好克隆