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

简介: 一、什么是建造者模式 建造者模式又叫生成器模式,它能将一个复杂对象的构建与其表示相分离,使得同样的构建模式可以创建不同表示。其类图如下: 由上面类图可以看出建造者模式主要有以下几个部分组成: 产品(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。 抽象建造者

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


一、什么是建造者模式


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


微信图片_20220428105122.png


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


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


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


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


分类: 设计模式

相关文章
|
18天前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
15 2
|
18天前
|
设计模式 uml
设计模式学习心得之前置知识 UML图看法与六大原则(下)
设计模式学习心得之前置知识 UML图看法与六大原则(下)
12 2
|
19天前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
11 1
|
13天前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
14 0
|
16天前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
18天前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)
|
18天前
|
设计模式 Java
Java设计模式之建造者模式详解
Java设计模式之建造者模式详解
|
18天前
|
设计模式 Java
设计模式之建造者模式
设计模式之建造者模式
|
18天前
|
设计模式 安全 Java
设计模式学习心得之五种创建者模式(1)
设计模式学习心得之五种创建者模式(1)
9 0
|
18天前
|
设计模式 数据可视化 程序员
设计模式学习心得之前置知识 UML图看法与六大原则(上)
设计模式学习心得之前置知识 UML图看法与六大原则(上)
10 0