設計模式----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