设计模式----Builder(生成器)模式
GoF:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder模式与Absrtact Factory模式非常像。GoF指出,他们二者的主要区别就在于Builder模式遵循一定的步骤一步一步创建对象。
Builder模式是为了将构建复杂对象的过程和他的部件相分离。因为一个复杂的对象不但有很多大量的组成部分,还有很多小的零件。他(复杂对象)本身要靠这些部件和零件来组装。例如:一座房子,它有很多部件:房间、窗户;还有门窗上的锁和窗户上的插销等小零件。Builder模式的目的就是为了将部件(门、窗等)和组装过程(整个房子的建造)分开。
现在假设一个房子有多个部件组成的,Builder模式的目的是把复杂对象的创建和部件的创建分别开来。分别用Builder类和Director类来表示。
下面以建造房子为例:
首先定义一个抽象类,它定义如何创建复杂对象的各个部件
package Builder;
public abstract class HouseBuilder
{
public abstract void BuildRoom(int roomNo);//构建房间
public abstract void BuildDoor(int room1, int room2);//构建门
//得到最后的房屋
public abstract House getHouse();
}//end abstract class HouseBuilder
用Director构建复杂对象(房子):
package Builder;
public class HouseDirector
{
public void createHouse(HouseBuilder concreteBuilder)
{
concreteBuilder.buildRoom(2);
concreteBuilder.buildDoor(3);
}//end createHouse(...)
}//end class HouseDirector
Builder的具体实现ConcreteHouseBuilder:通过完成Builder来构建产品(房子)的部件
package Builder;
public class ConcreteHouseBuilder extends HouseBuilder
{
private House house;
public ConcreteHouseBuilder()
{
house = new House();
}//end ConcreteHouseBuilder()
//创建屋子的数量
public void buildRoom(int roomNumber)
{
house.roomNumber = roomNumber;
}//end BuildRoom
//创建门的数量
public void buildDoor(int doorNumber)
{
house.doorNumber = doorNumber;
}
//返回创建好的房屋
public House getHouse()
{
return house;
}//end getHouse()
}//end class ConcreteHouseBuildera
具体的屋子:
package Builder;
public class House
{
int roomNumber;
int doorNumber;
public House()
{
roomNumber = 0;
doorNumber = 0;
}//end House()
public int getRoomNumber()
{
return roomNumber;
}//end getRoomNumber()
public int getDoorNumber()
{
return doorNumber;
}//end getDoorNumber()
}//end class House
Builder模式的具体运用:
/*
* BuilderPattern.java
*
* Created on 2006 年 3 月 28 日 , 下午10:01
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package Builder;
/**
*
* @author Administrator
*/
public class BuilderPattern
{
House house;
ConcreteHouseBuilder houseBuilder;
HouseDirector houseDirecor;
public BuilderPattern()
{
house = new House();
houseBuilder = new ConcreteHouseBuilder();
houseDirecor = new HouseDirector();
}
public void createHouse()
{
houseDirecor.createHouse(houseBuilder);
house = houseBuilder.getHouse();
System.out.println("My house has room :" + house.getRoomNumber());
System.out.println("My house has door :" + house.getDoorNumber());
}//end creatHouse()
public static void main(String[] args)
{
System.out.println("The Builder Pattern!");
BuilderPattern bp = new BuilderPattern();
bp.createHouse();
}
}//end class BuilderPattern
最后的结果:
My house has room :2
My house has door :3
最后给出UML图:
小结:
当一个对象由复杂的部件构成时,我们可以试着去用Builder模式来实现。Builder模式将对象的组装过程和对象的部件分离。其实这也非常好理解。比如说汽车,汽车的生产和汽车发动机的生产是分开的。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=967906