建造者模式

来源:互联网 发布:搜狗 新闻 数据集 编辑:程序博客网 时间:2024/05/16 06:45

建造者模式

建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式的通用类图如图


建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。

指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

产品(Product)角色:产品便是建造中的复杂对象。指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。

下面举一个在游戏中经常用到的例子,就是人物,人物有胖瘦有高矮

首先是人PersonBuild这个抽象类

public abstract class PersonBuild {public abstract void BulidHead();public abstract void BulidBody();public abstract void BulidArmLeft();public abstract void BulidArmRight();public abstract void BulidLegLeft();public abstract void BulidLegRight();}
定义瘦人类

public class PersonThinBuilder extends PersonBuild {@Overridepublic void BulidHead() {// TODO Auto-generated method stubSystem.out.println("瘦人的头");}@Overridepublic void BulidBody() {// TODO Auto-generated method stubSystem.out.println("瘦人的身体");}@Overridepublic void BulidArmLeft() {// TODO Auto-generated method stubSystem.out.println("瘦人的左胳膊");}@Overridepublic void BulidArmRight() {// TODO Auto-generated method stubSystem.out.println("瘦人的右胳膊");}@Overridepublic void BulidLegLeft() {// TODO Auto-generated method stubSystem.out.println("瘦人的左腿");}@Overridepublic void BulidLegRight() {// TODO Auto-generated method stubSystem.out.println("瘦人的右腿");}}
定义胖人类
public class PersonFatBuilder extends PersonBuild {@Overridepublic void BulidHead() {// TODO Auto-generated method stubSystem.out.println("胖人的头");}@Overridepublic void BulidBody() {// TODO Auto-generated method stubSystem.out.println("胖人的胖身体");}@Overridepublic void BulidArmLeft() {// TODO Auto-generated method stubSystem.out.println("胖人的左胳膊");}@Overridepublic void BulidArmRight() {// TODO Auto-generated method stubSystem.out.println("胖人的右胳膊");}@Overridepublic void BulidLegLeft() {// TODO Auto-generated method stubSystem.out.println("胖人的左长腿");}@Overridepublic void BulidLegRight() {// TODO Auto-generated method stubSystem.out.println("胖人的右长腿");}}
定义一个导演类PersonDirector类执行建造人的工作

public class PersonDirector {private PersonBuild pb;public PersonDirector(PersonBuild pb){this.pb=pb;}public void CreatePerson(){pb.BulidHead();pb.BulidBody();pb.BulidArmLeft();pb.BulidArmRight();pb.BulidLegLeft();pb.BulidLegRight();}}
测试实例

public class testdemo {public static void main(String arg[]){PersonDirector pdt=new PersonDirector(new PersonThinBuilder());pdt.CreatePerson();PersonDirector pdf=new PersonDirector(new PersonFatBuilder());pdf.CreatePerson();}}
结果

瘦人的头瘦人的身体瘦人的左胳膊瘦人的右胳膊瘦人的左腿瘦人的右腿胖人的头胖人的胖身体胖人的左胳膊胖人的右胳膊胖人的左长腿胖人的右长腿
建造者模式的优点

封装性

      使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是。

建造者独立,容易扩展

      各个不同人之间是相互独立的,对系统的扩展非常有利。

便于控制细节风险

      由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。


建造者模式的使用场景

         相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。

         多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

         产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。

         在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。


建造者模式的注意事项

      建造者模式关注的是的零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。

0 0
原创粉丝点击