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