对象创建模式
● 目标:绕开new具体对象,避免对象创建过程中导致的紧耦合,从而支持对象创建的稳定
● 典型模式:
○ Factorary method
○ Abstract method
○ Prototype
○ Builder
工厂模式
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类
- 将创建工作延迟到子类中后,核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂,只提供工厂子类必须实现的接口,这样的好处是可以不用修改已有的工厂类的情况下增加新的产品(每一种产品,都分别对应相应的工厂子类负责其创建工作)
-
类图如下
抽象工厂模式
- 提供一个接口,让接口负责创建一系列“相关或相互依赖的对象”,无需指定它们具体的类
- 与工厂模式的联系
○ 抽象工厂模式是为创建一组(有多类)相关或依赖的对象提供创建接口,工厂模式是为一类对象提供创建接口或延迟对象的创建到子类中实现。
○ 抽象工厂模式中的单个对象一般借助Factory模式实现 - 类图
Prototype模式
- 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象
- 原型模式提供了通过已存在对象创建新的对象的接口,C++中该接口通过拷贝构造函数实现
- 一般而言:需要创建具有复杂状态的对象,采用原型模式
- 原型模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝
- 类图
Builder模式
- 将一个复杂对象的构建与表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)
- 主要用于“分步骤构建一个复杂的对象”,分步骤是稳定的算法,复杂对象各个部分是变化的
- 与抽象工厂模式的区别
○ 强调分步创建对象,相同的创建过程可以获得不同的结果对象
○ 抽象工厂模式强调聚合多个相互关联的对象,提供同一接口 - 类图
隔离接口模式
- 在组件构建过程中,某些接口之间直接的依赖带来很多问题。采用添加一层间接(稳定)接口,来隔离相互紧密关联的接口是常见的解决方案。
- 典型模式
○ 门面模式
○ 代理模式
○ 适配模式
○ Mediator模式
门面模式
- 为子系统中的一组接口提供一个稳定的界面,即定义了一个高层接口,这个接口使得子系统更加容易复用
- 从客户程序的角度看,门面模式简化了整个组件系统的接口,对于系统内部和外面客户程序来说达到了解耦的效果
- 更注重从架构层次去看整个系统,而不是单个类的层次
- 门面模式的组件内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单功能的集合
代理模式
- 为其他对象提供一种代理以控制(隔离)堆这个对象的访问
- “增加一层间接层”是软件系统中许多复杂问题的解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,加入proxy间接层可以解决这类问题
- 具体proxy设计模式的实现方法和实现粒度相差很大,在程序设计的不同层次都有涉及。(虽然形式不同,解决问题的思想一致)
- 类图
适配模式
- 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作
- 系统的数据和行为都正确,但接口不符时,应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
- 想使用一个已经存在的类,但如果它的接口和要求不相同时,应该考虑用适配器模式。
- 两种Adapter模式的实现结构
○ 对象适配器:采用组合方案,推荐使用
○ 类适配器:采用多继承的方案,不推荐使用 - 类图
Mediator模式
- 用一个中介对象来封装一系列的对象交互。中介者模式使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互
- 将多个对象间的复杂关联关系解耦,将多个对象间的控制逻辑集中管理,变多个对象互联为多个对象和一个中介者关联
- 随着控制逻辑的复杂化,Mediator的实现会变得相当复杂
- 门面模式是解耦系统间的单向关联关系,中介者模式解耦系统中各个对象间的双向关联关系
- 类图