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

设计模式-建造者模式(Builder)

2016-04-13 10:55 639 查看
建造者模式(Builder),又叫生成器模式,将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式可以将一个产品的内部表象和产品的生成过程分割开来,从而可以是一个建造过程可以生成具有不同内部表象的产品对象。如果我们使用了建造者模式,你们用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。



Builder是为创建一个产品对象的各个部件指定的抽象接口。

ConcreteBuilder是具体的创建者,实现Builder接口,构造和装配各个部件。

Product是具体产品角色。

Director是指挥者,它是构建一个使用Builder接口的对象。

什么时候会使用建造者模式呢?它主要用于创建一些复杂的对象,这些对象内部构建间的创建顺序通常是稳定的,但对象内部的构建通常面临复杂的变化。建造者模式的好处就是使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。

建造者模式的基本代码:

package builder.demo;

产品类:

import java.util.ArrayList;

public class Product {
ArrayList<String> parts = new ArrayList<String>(); 
//添加产品部件
public void add(String mStr){
parts.add(mStr);
}
//列举产品部件
public void show(){
for(String str : parts){
System.out.println("parts:"+str);
}
}

}

//抽象建造者类,确定产品有2个部件partA,partB组成,声明一个得到产品创建后结果的方法

public abstract class Builder {
public abstract void builderPartA();
public abstract void builderPartB();
public abstract Product getResult();
4000

}

//具体的建造者类

public class ConcreteBuilder1 extends Builder {
private Product mProduct = new Product();
//建造具体的部件
@Override
public void builderPartA() {
mProduct.add("ConcreteBuilder1,部件AAA");
}

@Override
public void builderPartB() {
mProduct.add("ConcreteBuilder1,部件BBB");
}

@Override
public Product getResult() {
return mProduct;
}

}

//具体的建造者类

public class ConcreteBuilder2 extends Builder {
private Product mProduct = new Product();
//建造具体的部件
@Override
public void builderPartA() {
mProduct.add("ConcreteBuilder2,部件XXX");
}

@Override
public void builderPartB() {
mProduct.add("ConcreteBuilder2,部件YYY");
}

@Override
public Product getResult() {
return mProduct;
}

}

//指挥者类

public class Director {
//用来指挥建造过程
public void construct(Builder mBuilder){
mBuilder.builderPartA();
mBuilder.builderPartB();
}
//客户端代码
public static void main(String[] args){
Director mDirector = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
//指挥者用ConcreteBuilder1的方法来创建产品
mDirector.construct(b1);
Product p1 = b1.getResult();
p1.show();

//指挥者用ConcreteBuilder1的方法来创建产品
mDirector.construct(b2);
Product p2 = b2.getResult();
p2.show();

}

}

输出结果:

parts:ConcreteBuilder1,部件AAA

parts:ConcreteBuilder1,部件BBB

parts:ConcreteBuilder2,部件XXX

parts:ConcreteBuilder2,部件YYY
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: