­

設計模式學習——建造者模式

一、什麼是建造者模式

建造者模式又叫生成器模式,它能將一個複雜對象的構建與其表示相分離,使得同樣的構建模式可以創建不同表示。其類圖如下:

由上面類圖可以看出建造者模式主要有以下幾個部分組成:

  • 產品(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)建造者模式的缺點:

  • 產品的組成部分必須相同,這限制了其使用範圍;

  • 如果產品的內部變化複雜,如果產品內部發生變化,則建造者也要同步修改,後期維護成本較大。