跟屌絲大哥學習設計模式---生成器模式(Builder)解析例子
生成器模式屬于對象結構型模式,其意圖是將一個復雜對象的構建與他的表示分離,使得同樣的構建創建過程可以創建不同的表示。
適用性:
1. 當創建復雜對象的算法應該獨立于該對象的組成部分以及他們的裝配方式時
2. 當構造過程必須允許被構造的對象有不同的表示時。
參與者:
生成器Builder:為創建一個Product對象的各個部件指定抽象接口(AnimalBuilder)。
具體生成器ConcreteBuilder:實現Builder接口一構造和裝配該產品的各個部件。
定義并明確他所創建的表示,
提供一個檢索產品的接口(getAnimal)。
導向器:構建一個適用Builder對象的接口。
Product(Checken,pig):表示被構造的復雜對象。ConcreteBuilder創建該產品的內部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終的產品。

圖1
當客戶需要一個產品時,把需要的參數傳遞個導向器,導向器根據傳遞的參數調用具體的生成器,具體的生成器通過一系列的操作(getAnimal()通過調用其它的接口方法實現)最會返回一個產品。
Bridge模式的優點:
1. 它使你可以改變一個產品的內部表示,Builder對象提供給導向器一個構造產品的抽象接口,該接口使得生成器可以隱藏這個產品的表示和內部結構,他同時也隱藏了該產品是如何裝配的,因為產品時通過抽象接口構造的(注:本例子把接口的實現放在具體類中了),你在改變該產品的內部表示時所要做的只是定義一個新的生成器。
2. 他將構造代碼和表示代碼分開,這有點類似于模板模式。所不同的是模版模式最終是完成復雜的工作,而生成器的目的是要生成一個復雜的對象。
3. 他使得你對構造過程進行更加精細的控制。Builder模式是在導向者的控制下一步一步構造產品的,僅當該產品完成時,導向者才從生成器中取回產品。因此Builder模式能更好的反映產品的構造過程,使你可以更精細的控制構建過程,從而能更精細的控制所的產品的內部結構。
代碼示例:
AnimalBuilder:代碼
package builder;
public interface AnimalBuilder{
public void buildName();
public void buildLegs();
public void buildMeat();
public Animal getAnimal();
}
ChickenBuilder的代碼:
package builder;
public class ChickenBuilder implements AnimalBuilder{
private Animal chicken = null;
public ChickenBuilder(){
chicken = new Animal();
}
public void buildName(){
chicken.setName("chicken");
}
public void buildLegs(){
chicken.setLegs(2);
}
public void buildMeat(){
chicken.setMeat("chicken");
}
public Animal getAnimal(){
buildName();
buildLegs();
buildMeat();
return chicken;
}
}
Animal代碼:
package builder;
public class Animal{
private String name;
private String meat;
private int legs;
public String getName(){
return name;
}
public String getMeat(){
return meat;
}
public int getLegs(){
return legs;
}
public void setName(String aName){
name = aName;
}
public void setMeat(String aMeat){
meat = aMeat;
}
public void setLegs(int alegs){
legs = alegs;
}
}
Director代碼:
package builder;
public class Director{
public Animal getAnimal(String aName){
if(aName.equals("chicken")){
return new ChickenBuilder().getAnimal();
}
else if(aName.equals("pig")){
return new PigBuilder().getAnimal();
}
else return null;
}
}
客戶端代碼:
package builder;
public class Client{
public static void description(Animal animal){
String desc = "This animal is called "+animal.getName();
desc +="\n Its meat is "+animal.getMeat();
desc +="\n And it has "+animal.getLegs()+" legs.";
System.out.println(desc);
}
public static void main(String[] args){
String aName = "chicken";
Director d = new Director();
Animal animal =d.getAnimal(aName);
description(animal);
aName = "pig";
animal = d.getAnimal(aName);
description(animal);
}
}
結論:生成器模式使得客戶可以更加精細的控制一個對象的構建,每個具體的創建者包含了創建和裝配一個特定產品的所有代碼,這些代碼只用寫一次,便可以被不同的Director使用,從而可以裝配出不同的對象。
posted on 2012-12-18 17:16 順其自然EVO 閱讀(413) 評論(0) 編輯 收藏 所屬分類: 設計模式學習