面向物件設計模式之---建造者模式(Builder Pattern)
阿新 • • 發佈:2019-01-12
進入正題咯,今天要介紹的是建造者模式。可以想象一下這樣一個場景:工廠要組裝人偶的過程,以前是全手工的,難免會出現缺胳膊少腿的情況,現在都是機器流水線,這個問題就避免了。再比如我們經常見到的KFC和金拱門,它們的味道在全世界都是一樣的,但是如果我們去一些小餐館吃飯,每一次去的味道多多少少會有些不同。原因在哪裡呢?原因就在與洋快餐把所有的工序都進行了嚴格的控制,這樣生產出來的產品都是一個模子刻出來的;但是小餐館就不同了,菜好不好吃,完全憑廚師~
所以,在程式設計中為了效率(比如遊戲中要時不時產生敵人),可以將事務的細節部分和公共部分進行分離,這樣總可以保證在大體的結構上是不會出錯的,也就是不會出現缺胳膊少腿的情況。那麼細節部分怎麼辦呢?下面就要引入建造者模式
建造者模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。——《大話設計模式》
建造者模式的UML類圖如下,以構造小人為例:
可以發現,建造者模式由三個部分組織,第一個部分是抽象類 Builder,它裡面規定了人由哪些部分組成,這些都是抽象方法,我們知道,如果子類不實現這些抽象方法的話,程式是編譯不成功的,這也從一個側面保證了構建人物的完整性。第二個部分是ThinBuilder和FatBuilder,它們繼承Builder類,很顯然,這兩個類是用來處理構建人物的具體細節的,這也回答了我們上邊遺留的那個問題。最後一個部分是Director類,指揮者類,由它來控制
將構建人物的例子轉化為程式碼如下:
import java.util.*;
abstract class Builder
{
public abstract void buildHead();
public abstract void buildBody();
public abstract void buildLeftArm();
public abstract void buildRightArm();
public abstract void buildLeftLeg();
public abstract void buildRightLeg();
}
class ThinBuilder extends Builder
{
public void buildHead()
{
System.out.println("構建頭部...");
}
public void buildBody()
{
System.out.println("構建身體,這個人比較瘦...");
}
public void buildLeftArm()
{
System.out.println("構建左臂...");
}
public void buildRightArm()
{
System.out.println("構建右臂...");
}
public void buildLeftLeg()
{
System.out.println("構建左腿...");
}
public void buildRightLeg()
{
System.out.println("構建右腿...");
}
}
class FatBuilder extends Builder
{
public void buildHead()
{
System.out.println("構建頭部...");
}
public void buildBody()
{
System.out.println("構建身體,這個人比較胖...");
}
public void buildLeftArm()
{
System.out.println("構建左臂...");
}
public void buildRightArm()
{
System.out.println("構建右臂...");
}
public void buildLeftLeg()
{
System.out.println("構建左腿...");
}
public void buildRightLeg()
{
System.out.println("構建右腿...");
}
}
class Director
{
public void createPerson(Builder bt)
{
bt.buildHead();
bt.buildBody();
bt.buildLeftArm();
bt.buildRightArm();
bt.buildLeftLeg();
bt.buildRightLeg();
}
}
public class Main
{
public static void main(String args[])
{
ThinBuilder tb = new ThinBuilder();
FatBuilder fb = new FatBuilder();
Director d = new Director();
d.createPerson(tb);
d.createPerson(fb);
}
}
程式執行效果如下:
構建頭部...
構建身體,這個人比較瘦...
構建左臂...
構建右臂...
構建左腿...
構建右腿...
構建頭部...
構建身體,這個人比較胖...
構建左臂...
構建右臂...
構建左腿...
構建右腿...