JAVA设计模式-建造者模式-Builder

参考了http://yananay.iteye.com/blog/99387对建造者模式中的Director有了比较明确的理解,即Director是用来控制生产流程,而Builder只关心生产零件,这样就实现了“复合组件产品”的“零件/工艺”生产与“生产流程”的解耦。

这里是Bulider的模式化表述:

Builder(建造者)

clip_image003
意图:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用性:
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。

先解释一下意图将一个复杂对象的构建与它的表示分离,复杂对象中的每一个组件由Builder生产,由Director组织,而对外返回的时候就是一个产品,由此实现“构建与表示”的分离。而同样的构建过程,即由Director中的Construct()方法实现,由同一个相同的Director调用不同产品的Builder,即可实现相同构建过程而内部组件不同的表示

但是有人会奇怪,既然Builder可以返回产品,那为什么还需要Director呢?由于Director是实现对“构建过程”的规制,如下面实现所示,要交付一套完整装修的房子,必须是“建造”流程在“装修”流程之前,假设不对构建过程加以规制,就可能会出现“装修”在“建造”之前的局面,同时在Builder中封装的具体的“装修”“建造”方法并不是直接表现出来的,孰先孰后是用户事先并不知情的,因此要直接调用Builder完成房子的话,用户“并不知道”步骤,就会出现不可预知的问题(比如会出现“房子 is null,无法装修”)。

简而言之,建造者模式的目的就是实现“生产零件”与“生产流程”的解耦

实现:
我们要实现这样的目的:
Builder-工人,建造房子,装修房子
Director-监督者/指挥者/工头 指导工人的生产流程

抽象Builder
//Builder
interface Worker{
    void buildHouse();
    void decorateHouse();
    House getHouse();
}

具体Builder
//ConcreteBuilder
class WorkerA implements Worker{
    @Override
    public void buildHouse() {
        //To change body of implemented methods use File | Settings | File Templates.
        System.out.println("由A建造!");
    }

    @Override
    public void decorateHouse() {
        //To change body of implemented methods use File | Settings | File Templates.
        System.out.println("由A装修!");
    }

    @Override
    public House getHouse() {
        return new House();  //To change body of implemented methods use File | Settings | File Templates.
    }
}

class WorkerB implements Worker{
    @Override
    public void buildHouse() {
        //To change body of implemented methods use File | Settings | File Templates.
        System.out.println("由B建造!");
    }

    @Override
    public void decorateHouse() {
        //To change body of implemented methods use File | Settings | File Templates.
        System.out.println("由B装修!");
    }

    @Override
    public House getHouse() {
        return new House();  //To change body of implemented methods use File | Settings | File Templates.
    }
}

指导者
//Director
class Director{
    void Constructure(Worker worker){
        worker.buildHouse();
        worker.decorateHouse();
    }
}

产品房子(简化了)
class House{
}

测试
    public static void main(String[] args){
        Worker workerA=new WorkerA();
        Worker workerB=new WorkerB();
        Director director=new Director();
        director.Constructure(workerA);
        director.Constructure(workerB);
    }

结果
由A建造!
由A装修!
由B建造!
由B装修!

End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值