设计模式放了一段时间了,今天学习了生成器模式。

     名称:生成器模式。
     意图:它一个复杂的对象与他的构造相分离,使得同样的构造过程可以创建不同的表示。
     适用环境:
                  它创建复杂对象的算法,应该独立于该对象的组成部分及它们的装配方式。
                   当构造过程必须允许被构造的对象有不同的表示时。(单单这两话我没有完全理解,就像很多高人说学习设计模式比成是修炼内功,难点就是如何在实际开发中运用。)

     它的特点:Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到。
     例如:一座房子,它有很多部件:房间、窗户;还有门窗上的锁和窗户上的插销等小零件。Builder模式的目的就是为了将部件(门、窗等)和组装过程(整个房子的建造)分开。

 

现在假设一个房子有多个部件组成的, Builder 模式的目的是把复杂对象的创建和部件的创建分别开来。分别用 Builder 类和 Director 类来表示。


  首先定义一个房子的部件接口:

  代码清单1:房子(House)的部件
 
package builder;
public interface Builder{
        
//构造房子部件--门
    public void buildDoors(int dCount);
    
//构造房子部件--窗户
        public void buildWindows(int wCount);
    
       
//返回最后组装成品结果 (返回最后装配好的汽车)
    
//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.

    House getHouse();
}


代码清单2:Director类用来构建最后的复杂对象房子House
package builder;
public class Director{

    
private Builder builder;

    
public Director(Builder builder){
        
this.builder=builder;
    }


       
// 将部件Door,window最后组成复杂对象House的过程
          public void constructor(){
        builder.buildDoors(
1);
        builder.buildWindows(
2);
    }

}


代码清单3:Builder的具体实现ConcreteBuilder类
package builder;
public class ConcreteBuilder implements Builder{
    
private int doorCount;
    
private int windowCount;
        
        
//这里是具体如何构建门door
    public void buildDoors(int doorCount){
        
this.doorCount=doorCount;
    }


        
//这里是具体如何构建窗户window
    public void buildWindows(int windowCount){
        
this.windowCount=windowCount;
    }

 
        
//返回最后组装成品结果
    public House getHouse(){
        
return new House(doorCount,windowCount);
    }

}


代码清单4:复杂对象-----产品房子
package builder;
public class House{
    
    
private int doorCount,windowCount;
    
public House(int doorCount,int windowCount){
        
this.doorCount=doorCount;
        
this.windowCount=windowCount;
    }

        
    
public String toString(){
        
return "Constructor House:door Count="+doorCount+",window count="+windowCount;
    }

}
 

代码清单5:Builder模式的具体运用
package builder;
public class BuilderPattern{

    
public static void main(String[] args){
        ConcreteBuilder builder
=new ConcreteBuilder();
        Director director
=new Director(builder);
        
                director.constructor();
        House house
=builder.getHouse();
        System.out.println(house);
    }

}


最后的输出结果如下:
  Constructor House:door Count=1,window count=2
  Press any key to continue...

由于本人没有学过UML,所以没有画出相应的UML类,准备在学习设计模式后再学习UML。
 

参考文章:1.http://blog.csdn.net/qutr/archive/2006/07/24/967906.aspx
                    2.http://www.jdon.com/designpatterns/builder.htm
                    3.http://www.lvjiyong.com/books/DesignPatterns/13.html