生成器模式(Builder Pattern)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器模式(Builder Pattern)相关的知识,希望对你有一定的参考价值。

参考技术A 在《Head First Design Patterns》文中是这么介绍生成器模式的,“封装一个产品的构造过程,并允许按步骤构造”,感觉说得不是很清楚。而在网上查找相关资料是这么解释的,建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式。

建造者模式(Builder Pattern)的作用是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。这句话还是需要结合例子来分析解释。

需要生成的对象具有复杂的内部结构,而组成该对象的基本元素是不变的,改变的是基本元素的不同组合。经常被用来创建组合结构。

优点
1、将一个复杂对象的创建过程封装起来。
2、允许对象通过多个步骤来创建,并且可以改变过程(这里和只有一个步骤的工厂模式不同)。
缺点
1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。

这里举的例子是《Head First Design Patterns》一文中提到关于假期计划。每个人的度假计划都不一样,例如天数和活动类型。也就是说每个人每天的计划都可能不一样,例如lgy要安排五一的三天假期。5月1日他要去定旅馆,买公园门票,去外面餐馆吃饭,5月2号定旅馆,买公园门票,还要溜冰等冰上的特殊活动以及外出用餐;5月3号买公园门票,定旅馆和进行竞技场特殊活动。
所以我们可以看出假期计划中变化的有天数和活动类型(这里的活动类型指的是定旅馆,买公园门票,用餐和特殊活动),可以看出一天的假期计划是通过某一天的日期与各种活动组合而成的。
上面的类图是《Head First Design Patterns》一文中给出的,我写的例子与上面给出的类图有些不一样。
首先我们看一下活动类型,ActivityType是活动类型的接口,所以的活动类型都实现了这个接口。

活动类型:订房

活动类型:公园买票

活动类型:用餐

去黄焖鸡用餐

去沙县小吃用餐

活动类型:特殊活动

特殊活动之冰上模式

特殊活动之竞技场模式

假期计划接口

假期计划对象实例

客户端调用

“将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示",现在我们应该可以理解这句话的意思了,生成器模式主要用于创建一个由许多基础部分组合而成的对象,而通过这些基础部分的不同组合可以让这个对象拥有不同的表现。感觉《Head First Design Patterns》没有将生成器模式进行详细介绍也许是这个模式不经常使用到。

http://www.runoob.com/design-pattern/builder-pattern.html

http://download.csdn.net/download/lgywsdy/10026477

java设计模式创建模式Creational Pattern建造模式Builder Pattern

 1 package com.tn.pattern;
 2 
 3 public class Client {
 4     public static void main(String[] args) {
 5         Director director=Director.getInstance();
 6         director.construct(new ConcreteBuilder1());        
 7         director.construct(new ConcreteBuilder2());
 8     }
 9 }
10 
11 class Director{
12     static Director director;
13     private Director(){}
14     public static Director getInstance(){
15         if(director==null)
16             director=new Director();
17         return director;
18     }
19     public void construct(Builder builder){
20         builder.buildPart1();
21         builder.buildPart2();
22     }
23 }
24 
25 interface Builder{
26     void buildPart1();
27     void buildPart2();
28     Product retrieveResult();
29 }
30 
31 class ConcreteBuilder1 implements Builder{
32     Product product;
33     @Override
34     public void buildPart1() {
35         System.out.println("ConcreteBuilder1.buildPart1()");
36         product=new Product1();
37     }
38     
39     @Override
40     public void buildPart2() {}
41     
42     @Override
43     public Product retrieveResult() {
44         return product;
45     }
46 }
47 
48 class ConcreteBuilder2 implements Builder{
49     Product product;
50     @Override
51     public void buildPart1() {}
52     
53     @Override
54     public void buildPart2() {
55         System.out.println("ConcreteBuilder2.buildPart2()");
56         product=new Product2();
57     }
58     
59     @Override
60     public Product retrieveResult() {
61         return product;
62     }
63 }
64 
65 interface Product{}
66 
67 class Product1 implements Product{
68     public Product1(){
69         System.out.println("Product1.Product1()");
70     }
71 }
72 
73 class Product2 implements Product{
74     public Product2(){
75         System.out.println("Product2.Product2()");
76     }
77 }

 

以上是关于生成器模式(Builder Pattern)的主要内容,如果未能解决你的问题,请参考以下文章

生成器模式(Builder Pattern)

Java建造者模式(Builder pattern)

Builder生成器(创建型模式)

创建模式之建造者模式

每天一个设计模式-7 生成器模式(Builder)

6.生成器模式-builder