设计模式学习——建造者模式
一、什么是建造者模式
建造者模式又叫生成器模式,它能将一个复杂对象的构建与其表示相分离,使得同样的构建模式可以创建不同表示。其类图如下:
由上面类图可以看出建造者模式主要有以下几个部分组成:
-
产品(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)建造者模式的缺点:
-
产品的组成部分必须相同,这限制了其使用范围;
-
如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。