java与模式笔记(7)...
时间:2010-08-12 来源:itcareerist
建造(Builder)模式是对象的创建模式。
建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
结构与角色(图)
抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接诶创建产品对象的是具体创建者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法,比如buildPart1()和buildPart2();另一种是结果返还方法,即retrieveResult()。一般来说,产品所包含的零件数与建造方法的数目相符。换言之,有多少个零件,就有多少相应的建造方法。
具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例,如果有多个产品角色,则也有多个具体构造者角色。这个角色要完成的任务包括:1实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2在建造过程完成后,提供产品的实例。
导演者(Directory)角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。
产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个得产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
导演者对象不创建具体建造者对象,该对象由客户端创建,目的是为了将导演者对象与具体建造者对象的耦合变成动态的,从而使导演者对象可以操纵数个具体建造者对象中的任何一个。
建造模式的几种变形:
1、 空的零件构造方法。
2、 省略抽象建造者角色。
3、 省略导演者角色。
建造模式的使用情况:
1、 需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以仅仅是一个对象(即产品对象)的一个组成部分。
2、 需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。有时产品对象的属性并无彼此依赖的关系,但是在产品的属性没有确定之前,产品对象不能使用。这是产品对象的实例化,属性的赋值和使用仍然是分步骤进行的,因此,建造模式仍然有意义。
3、 在对象创建过程中会使用到系统的其他一些对象,这些对象在产品对象的创建过程中不易得到。
建造模式的主要效果:
1、 建造模式的使用使得产品的内部表象可以独立地变化。使用建造模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其他的Builder无关。
3、 模式所建造的最终产品更易于控制。
建造模式和抽象工厂模式的区别:在抽象工厂模式中,每一次工厂对象被调用时都会返回一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造类则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造者模式的客户端拿到的是一个完整的最后产品。策略模式的目的是为算法提供抽象的接口。换言之,一个具体策略类把一个算法包装到一个对象里面,而不同的具体策略对象为一种一般性的服务提供不同的实现。
建造模式和策略模式的区别:建造模式适用于为客户端一点一点地建造新的对象,而不同类型的具体建造者角色虽然都拥有相同的接口,但是它们所创建出来的对象则可能完全不同。