构造模式
2018-01-22 19:17
65 查看
构造模式
构造模式是一种对象的创建模式。他可以将一个复杂对象的内部构成特征与对象的构建过程完全分开。上图是构造模式的其中一种实现示意图。
从图中,我们可以总结出构造模式所涉及的四个角色:
客户端(Client)角色——调用具体的构造器完成对象构建。注意这个角色只负责构造器的创建和选择,对于产品的具体信息并不知晓
抽象构造器(Builder)角色——这是一个抽象的构造器角色,由一组接口方法来扮演。在实际情况中,这一组接口会由一个核心的build方法(负责最终对象的创建)以及若干辅助方法(帮助构建对象的内部属性特征)共同构成
具体构造器(ProductBuilder)角色——具体的构造器实现。具体构造器是整个构造模式的核心,其中封装了一个目标的对象实例。当其中的核心build方法被客户端调用时,在其内部缓存的目标对象实例会真正返回。而在这之前,所有其他辅助方法的调用都仅仅是将内部缓存的目标对象进行内容上的填充
产品(Product)角色——整个构造模式的产物。这个角色是构造模式执行的结果
在实际应用中,构造模式有一种变种:当对于构造对象非常明确,而对于构造过程化的定义并不严格时,我们可以省略“抽象构造器”这一接口定义的角色而直接使用一个“具体构造器”,客户端通过直接调用“构造器”内部所定义的方法来完成对象构建。如下图
构造函数之所以能够产生这样的变种,与所构造对象的特性和整个构造过程有直接的联系。但无论是哪种形式的构造模式实现,客户端(Client)角色、构造器(Builder)和构造对象(Target)都是构造模式必不可少的核心要素。它们之间的调用关系,则构成了构造模式运行的基础。
构造模式适用于构建对象的构造过程十分复杂、构建对象的初始化对于其内部的对象有着强烈逻辑依赖的业务场景;适用于构建对象拥有不确定的内部特性,客户端可以根据其自身需要选择对象构建方式和对象内部特性的业务场景
以“制造咖啡”为例子,我们用时序图来表示
在时序图中,我们可以看到整个构造模式中的核心元素“构造器”的调用过程,可以分为三个主要的步骤:
构造器(Builder)首先会创建一个目标对象的实例加以缓存
构造器依次调用构建目标对象特性的行为方法(在此例中就是addSugar、addMilk等),其目的在于为目标对象搜集并设置其内在特性
构造器最终调用其核心方法build完成目标对象的创建并返回给客户端
在整个过程中,我们可以看到后面两个步骤是构造模式真正涉及的“共性”部分。我们几乎可以在所有构造模式的使用过程中看到这两个步骤的存在。因为这两个步骤是构造模式能够将对象构造模式化的依据:前一个步骤能够确保将复杂的对象构造过程进行核心的逻辑划分,从而使得每一个子步骤都能独立完成逻辑而不造成对其他外部环境的依赖;后一个步骤则在前一个步骤的基础之上,将真正的对象创建封装起来。
参考:整理归纳自《struts2技术内幕——深入解析struts2架构设计与实现原理》
相关文章推荐
- Scala 深入浅出实战经典 第77讲:模式匹配下的提取器动手构造实战
- 构造方法私有化及单态模式
- 构造模式实践
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- java中 构造方法和单例设计模式(基础)
- 1、c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以
- Python构造方法、析构方法和单例模式
- java 构造方法私有化及单态模式
- 二阶构造模式
- 生成器【建造者】模式:将一个复杂对象的构造与它的表示分离
- 如何使用设计模式来构造系统--(6)
- 如何使用设计模式来构造系统--(9)
- Effective Java Item2:当构造方法的参数(尤其是可选参数)比较多时使用Builder模式
- 单例模式的构造和析构问题
- python基础-单例模式、__new__方法、利用new构造对象
- 谈ObjC对象的两段构造模式【转】
- DAO设计模式之数据层的构造
- cocos2d-x中的二段构造模式
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- 二段构造模式 初始化对象