Builder模式
主要用於“構建一個複雜的對象”。把複雜對象的創建過程加以抽象,通過子類繼承和重寫方法,來得到具有複合屬性的對象。 同時爲了統一創建過程,把對象的創建操作統一封裝到Director的方法中。
GOF:講一個複雜對象的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。即構建過程相同,但是子部件卻不相同。
抽象工廠注重的是不同的工廠生產不同的產品,builder注重的是某個產品由不同的零件組成,產品的生產工程。
Director就是負責產品組裝的,是控制生產過程的;而builder是負責產品部件生產的。這樣就實現了“過程”和“部件”的解耦。
抽象工廠通過不同的構建過程生成不同的對象表示,而Builder模式通過相同的構建過程生成不同的表示。
適用性:
1.當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2.當構造過程必須允許被構造的對象有不同的表示時。
結構圖(Struct):
import java.util.ArrayList;
抽象的創建者類,主要給具體的創建者類創建模板,具體的創建者繼承該類後,重寫方法,用自己的方式創建風格不同的複雜對象的屬性。但總體複雜對象的結構已經固定。
abstract class Builder{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindows();
public abstract void BuildHouseCeiling();
public abstract House GetHouse();
}
具有複雜屬性的對象。
class House{
private ArrayList <String>parts=new ArrayList<String>();
public void add(String str){
parts.add(str);
}
public void show()
{
for(String part:parts)
{
System.out.println(part+"\t");
}
System.out.println("\n");
}
}
統一創建的過程,將創建過程統一。也可以有具體的流程
class Director{
public void construct(Builder builder){
builder.BuildDoor();
builder.BuildWall();
builder.BuildWindows();
builder.BuildHouseCeiling();
}
}
具體的創建者類,負責創建具有不同表示的複雜對象
class ChineseBuilder extends Builder{
private House chineseHouse=new House();
public void BuildDoor() {
chineseHouse.add("ChineseDoor");
}
public void BuildWall() {
chineseHouse.add("ChineseWall");
}
public void BuildWindows() {
chineseHouse.add("ChineseWindows");
}
public void BuildHouseCeiling() {
chineseHouse.add("ChineseHouserCeiling");
}
public House GetHouse() {
return chineseHouse;
}
}
class EnglandBuilder extends Builder{
private House englandHouse=new House();
public void BuildDoor() {
englandHouse.add("EnglandDoor");
}
public void BuildWall() {
englandHouse.add("EnglandWall");
}
public void BuildWindows() {
englandHouse.add("EnglandWindows");
}
public void BuildHouseCeiling() {
englandHouse.add("EnglandHouserCeiling");
}
public House GetHouse() {
return englandHouse;
}
}
public class BuilderPattern {
public static void main(String[] args) {
Builder chineseBuilder=new ChineseBuilder();
Builder englandBuilder=new EnglandBuilder();
Director director=new Director();
director.construct(chineseBuilder);
House chineseHouse=chineseBuilder.GetHouse();
chineseHouse.show();
director.construct(englandBuilder);
House englandHouse=englandBuilder.GetHouse();
englandHouse.show();
}
}