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

建造者模式(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();
}

//具体的建造者类
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值