概念
我们通过字面意思,其实很容易理解建造者模式,建造者模式就好像我们建房子一样,我们要一步一步,通过各个部件的组合,才能建成房子,但房子有好种样子,我们选的瓷砖品质,颜色不同,建造出来的房子外观也不一样,但建造房子的步骤上,还是不变的,这就是建造者模式的特点。
建造者模式就是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实例
又到了讲故事帮助理解建造者模式的流程。
有一个朋友,最近非常着迷肝原神,沉迷于游戏角色无法自拔,这个时候它找到你,想让你帮忙给他开发原神游戏角色山寨版,本着抚平万千爆肝玩家的心,你欣然答应了他们。第一个版本,你准备开发一个草神、雷神、丘丘人三个角色,给朋友玩玩。
- 首先,我们需要写一个游戏角色类
public class Actor {
private String name;//角色名称
private String sex;//角色性别
private String face;//角色的脸型
private String hair;//角色的头发
private String criticalDamage;//角色暴击伤害
private String criticalHitRate;//角色暴击率
private int blood;//血量
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setFace(String face) {
this.face = face;
}
public void setHair(String hair) {
this.hair = hair;
}
public void setCriticalDamage(String criticalDamage) {
this.criticalDamage = criticalDamage;
}
public void setCriticalHitRate(String criticalHitRate) {
this.criticalHitRate = criticalHitRate;
}
public void setBlood(int blood) {
this.blood = blood;
}
public String getName() {
return this.name;
}
public String getSex() {
return this.sex;
}
public String getFace() {
return this.face;
}
public string getHair() {
return this.hair;
}
public String getCriticalDamage() {
return this.criticalDamage;
}
public String getCriticalHitRate() {
return this.criticalHitRate;
}
public int getBlood() {
return this.blood;
}
}
- 游戏角色建造者
public abstract class ActorBuilder {
protected Actor actor = new Actor();
public abstract void buildName();
public abstract void buildSex();
public abstract void buildFace();
public abstract void buildHair();
public abstract void buildCriticalDamage();
public abstract void buildCriticalHitRate();
public abstract void buildBlood();
public Actor createActor() {
return actor;
}
}
- 雷神角色建造者
public class LeiJunBuilder extends ActorBuilder {
public void buildName() {
actor.setName("雷电将军");
}
public void buildSex() {
actor.setSex("女");
}
public void buildFace() {
actor.setFace("此处假装画了雷神的脸");
}
public void buildHair() {
actor.setHair("此处是雷电将军的长发");
}
public void buildCriticalDamage() {
actor.setCriticalDamage("1000%");
}
public void buildCriticalHitRate() {
actor.setCriticalHitRate("100%");
}
public void buildBlood() {
actor.setBlood(99999999999999999999999999999);
}
}
- 纳西妲角色建造者
public class GrassGodBuilder extends ActorBuilder {
public void buildName() {
actor.setName("纳西妲");
}
public void buildSex() {
actor.setSex("女");
}
public void buildFace() {
actor.setFace("此处假装画了纳西妲的脸");
}
public void buildHair() {
actor.setHair("此处是纳西妲的长发");
}
public void buildCriticalDamage() {
actor.setCriticalDamage("2000%");
}
public void buildCriticalHitRate() {
actor.setCriticalHitRate("100%");
}
public void buildBlood() {
actor.setBlood(99999999999999999999999999999);
}
}
- 丘丘人角色建造者
public class QiuQiuHumanBuilder extends ActorBuilder {
public void buildName() {
actor.setName("丘丘人");
}
public void buildSex() {
actor.setSex("男");
}
public void buildFace() {
actor.setFace("此处假装画了丘丘人的脸");
}
public void buildHair() {
actor.setHair("此处是丘丘人头发");
}
public void buildCriticalDamage() {
actor.setCriticalDamage("0.001%");
}
public void buildCriticalHitRate() {
actor.setCriticalHitRate("0.000000001%");
}
public void buildBlood() {
actor.setBlood(9999999999999999999);
}
}
- 角色控制器
public class ActorController {
public Actor construct(ActorBuilder ab) {
Actor actor;
ab.buildName();
ab.buildSex();
ab.buildFace();
ab.buildHair();
ab.buildCriticalDamage();
ab.buildCriticalHitRate();
ab.buildBlood();
actor = ab.createActor();
return actor;
}
}
通过以上实例,我们分析一下建造者模式的构成:
- 产品(Product):它是被构建的复杂对象,包含多个组成部件。例如上例的Actor。
- 抽象建造者(Builder):为创建一个产品对象的各个部件指定抽象接口,可以是接口也可以是抽象类。例如ActorBuilder。
- 具体建造者(ConcreteBuilder):实现抽象建造者的接口,实现产品的各个部件的具体构造和装配方法。例如LeiJunBuilder、GrassGodBuilder 、QiuQiuHumanBuilder 。
- 指挥者(Director):负责安排复杂对象的创造顺序,例如上例中,可以通过指挥者(ActorController),来调整是先有头发还是现有脸.
缺点
- 所创建的产品必须具有较多的共同点,并且组成部分相似。
- 如果产品内部变化复杂,需要定义的具体建造者太多,会导致系统过于庞大,系统理解难度也相对应会增加。
适用场景
- 产品内部结构比较复杂。
- 产品属性之间相互依赖,生成顺序需要指定。
- 业务逻辑过程相同,结果不同。
上期答案
B
一问三不知
以下关于建造者模式叙述错误的是()。
A. 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
B. 建造者模式允许用户只通过指定复杂对象的类型和内容就可以创建他们,而不需要知道内部的具体构建细节
C. 当需要创建的产品对象有复杂的内部结构时可以考虑适用建造者模式
D. 在建造者模式中,各个具体的建造者之间通常具有较强的依赖关系,可通过指挥者类组装成一个完整的产品对象返回给客户