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