阅读 146

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

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

一、什么是建造者模式

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

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

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

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

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

服务器评测 http://www.cncsto.com/ 

服务器测评 http://www.cncsto.com/ 

站长资源 https://www.cscnn.com/ 


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐