Creational模式之Builder模式

时间:2022-03-30 13:46:57

1.意图

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

查看很多其它请点击

2.别名

3.动机

一个RTF(Rich Text Format)文档交换格式的阅读器应能将RTF转换为多种正文格式。该阅读器能够讲RTF文档转化成不同ASCII文本或转换成一个能以交互方式编辑的正文窗体组件。

但问题在于可能转换的数目是无限的。因此要能够非常easy实现新的转换的添加,同一时候却不改变RTF阅读器。

4.适用性

下面情况使用Builder模式:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时。
  • 当构造过程必须同意被构造的对象有不同的表示时。

5.结构

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。事实上建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。我们看一下代码:

6.代码演示样例

还和前面一样。一个Sender接口。两个实现类MailSender和SmsSender。最后:

实现代码:

首先,创建二者的共同接口::

public interface Sender {
public void Send();
}

其次,创建实现类:

public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
} public class SmsSender implements Sender { @Override
public void Send() {
System.out.println("this is sms sender!");
}
}

最后,建造者类:

public class Builder {

    private List<Sender> list = new ArrayList<Sender>();

    public void produceMailSender(int count){
for(int i=0; i<count; i++){
list.add(new MailSender());
}
} public void produceSmsSender(int count){
for(int i=0; i<count; i++){
list.add(new SmsSender());
}
}
}

測试类:

public class Test {

    public static void main(String[] args) {
Builder builder = new Builder();
builder.produceMailSender(10);
}
}

从这点看出。建造者模式将非常多功能集成到一个类里。这个类能够创造出比較复杂的东西。所以与project模式的差别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分。因此,是选择工厂模式还是建造者模式,依实际情况而定。

7.相关模式

  • Abstract Factory与Builder类似。由于它也能够创建复杂对象。

    基本的差别是Builder模式着重于一步步构造一个复杂对象。

    而Abstract Factory着重于多个系列的产品对象(简单的或是复杂的)。Builder在最后的一步返回产品。而对于Abstract Factory来说。产品是马上返回的。

  • Composite一般是用builder生成的。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539