設計模式學習——建造者模式
一、什麼是建造者模式
建造者模式又叫生成器模式,它能將一個複雜對象的構建與其表示相分離,使得同樣的構建模式可以創建不同表示。其類圖如下:
由上面類圖可以看出建造者模式主要有以下幾個部分組成:
-
產品(Product):它是包含多個組成部件的複雜對象,由具體建造者來創建其各個零部件。
-
抽象建造者(Builder):規範產品的創建。
-
具體建造者(ConcreteBuilder):實現 Builder 接口,完成複雜產品的各個部件的具體創建方法。
-
導演(Director):它調用建造者對象中的部件構造與裝配方法完成複雜對象的創建,其不涉及具體產品的信息。
二、實際應用
我們開發一塊遊戲,遊戲中存在兩種NPC,一種是對玩家友好的,可以對玩家提供遊戲信息、售賣道具等,另一種是敵對的,其會攻擊玩家,不管是哪一種NPC,它都具有:姓名、性別、職業、是否具有攻擊性等屬性,那麼我們來看下如何利用建造者模式創建他們吧。
(1)NPC角色類
public class Character { private String name; private String sex; private boolean aggressive; private String occupation; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public boolean isAggressive() { return aggressive; } public void setAggressive(boolean aggressive) { this.aggressive = aggressive; } public String getOccupation() { return occupation; } public void setOccupation(String occupation) { this.occupation = occupation; } @Override public String toString() { return "Character{" + "name='" + name + '\'' + ", sex='" + sex + '\'' + ", aggressive=" + aggressive + ", occupation='" + occupation + '\'' + '}'; } public void show() { System.out.println(this.toString()); } }
(2)抽象建造者Builder
public abstract class Builder { protected Character character = new Character(); public abstract void setName(); public abstract void setSex(); public abstract void setAggressive(); public abstract void setOccupation(); public Character getCharacter() { return character; } }
(3)友好的NPC創建者
public class FriendlyNpcBuilder extends Builder { @Override public void setName() { character.setName("叢林巡邏兵"); } @Override public void setSex() { character.setSex("man"); } @Override public void setAggressive() { character.setAggressive(false); } @Override public void setOccupation() { character.setOccupation("遊俠"); } }
(4)敵對的NPC創建者
public class AggressiveNpcBuilder extends Builder { @Override public void setName() { character.setName("叢林殺手"); } @Override public void setSex() { character.setSex("man"); } @Override public void setAggressive() { character.setAggressive(true); } @Override public void setOccupation() { character.setOccupation("盜賊"); } }
(5)導演類
public class NpcDirector { public Character createNpc(Builder builder) { builder.setName(); builder.setSex(); builder.setAggressive(); builder.setOccupation(); return builder.getCharacter(); } }
使用
我們首先創建一個NpcDirector,接着創建目標Builder,最終通過NocDirector創建NPC。
public class Main { public static void main(String[] args) { NpcDirector director = new NpcDirector(); Character friendlyNpc = director.createNpc(new FriendlyNpcBuilder()); friendlyNpc.show(); Character aggressiveNpc = director.createNpc(new AggressiveNpcBuilder()); aggressiveNpc.show(); } }
三、總結
1)建造者模式的優點:
-
封裝性:使用建造者模式客戶端不必知道產品細節;
-
擴展性:建造者是獨立可擴展的,如FriendlyNpcBuilder、AggressiveNpcBuilder;
-
便於控制細節風險:由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他模塊產生影響;
2)建造者模式的缺點:
-
產品的組成部分必須相同,這限制了其使用範圍;
-
如果產品的內部變化複雜,如果產品內部發生變化,則建造者也要同步修改,後期維護成本較大。