设计模式学习——建造者模式

一、什么是建造者模式

建造者模式又叫生成器模式,它能将一个复杂对象的构建与其表示相分离,使得同样的构建模式可以创建不同表示。其类图如下:

《设计模式学习——建造者模式》

由上面类图可以看出建造者模式主要有以下几个部分组成:

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

  • 产品的组成部分必须相同,这限制了其使用范围;

  • 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

点赞