您的位置:首页 > 产品设计 > UI/UE

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

2013-08-22 17:43 603 查看
参考了/article/3748192.html对建造者模式中的Director有了比较明确的理解,即Director是用来控制生产流程,而Builder只关心生产零件,这样就实现了“复合组件产品”的“零件/工艺”生产与“生产流程”的解耦。

这里是Bulider的模式化表述:

Builder(建造者)



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

先解释一下意图将一个复杂对象的构建与它的表示分离,复杂对象中的每一个组件由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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: