设计模式之建造者模式

设计模式之建造者模式

建造者模式是创建型设计模式。将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示。

在玩游戏创建角色的时候,系统默认一个初始人物,开始创建时,需要输入角色的名称,选择人物的性别。之后可以自定义武器,技能等等。拥有的人物可能各不相同,但是生成人物的流程是相同的。这个流程就是”建造过程“,这种构建建造过程的模式,就是建造者模式。

使用建造者模式:

  • 可以对用户屏蔽构建的具体细节

  • 用户只需给出复杂对象的内容和类型可以创建出对象

  • 依据构造流程构建出复杂对象

解决了什么问题

建造者模式避免了在构建相同的对象,对象内具有不同的属性时,造成的构造器污染(constructor pollution)。方便的创建一系列不同的相同类型的对象。解决了可伸缩性的构造器反设计模式 (telescoping constructor anti-pattern

应用场景

  • 对象足够复杂,创建这个对象的方法应与创建这个对象的组件和组装方式分开.
  • 当构造对象时要求对这个对象具有不同的行为.

建造者模式结构

  1. 抽象Builder接口,定义构造流程结构(非必须)
  2. 实现Builder实现类,实现复杂对象构造结构
  3. Product 具体复杂实体类,也就是需要构建的结构
  4. Director 指挥者,调用Builer进行构建的指挥者(非必须)

建造者模式类图

上图为建造者模式类图:其中CharacterBuilder 和 Characters 中的属性相同,CharacterBuilder 存在的目的就是多种构造不同行为的Characters .

具体可以看下面代码实例

代码

角色实体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Characters {
// 角色构造器内有多个角色属性
private String name;
private int age;
private String sex;
private String skill;
private String weapon;
// 使用构造器来构造实体 其中实体属性有builder中来
public Characters(CharacterBuilder builder) {
this.name = builder.getName();
this.age = builder.getAge();
this.sex = builder.getSex();
this.skill = builder.getSkill();
this.weapon = builder.getWeapon();
}

public void showCharacterBoard(){
System.out.println("人物 : " + this.name + " 年龄 :" + this.age + " 性别:" + this.sex + " 技能:" +this.skill + " 武器:" + this.weapon);
}
}

角色构建器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class CharacterBuilder {
// 与角色实体保持相同的属性
private String name;
private int age;
private String sex;
private String skill;
private String weapon;

public String getName() {
return name;
}

public int getAge() {
return age;
}

public String getSex() {
return sex;
}

public String getSkill() {
return skill;
}

public String getWeapon() {
return weapon;
}
//构造基本属性的构造器
public CharacterBuilder buildBasicAttributes(String name , int age, String sex){
//保证姓名不能为空
if(name == null || "".equals(name)){
throw new IllegalArgumentException("name can not be empty ");
}else {
this.name = name;
this.age = age;
this.sex = sex;
}
return this;
}

public CharacterBuilder buildSkill(String skill){
this.skill = skill;
return this;
}

public CharacterBuilder billdWeapon(String weapon){
this.weapon = weapon;
return this;
}

//生成角色实体
public Characters build(){
return new Characters(this);
}

}

客户端类:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class App {
@Test
public void testBuildCharacter(){
// 链式调用,最后使用build方法新建一个角色实体
Characters characters = new CharacterBuilder()
.buildBasicAttributes("jack",18,"man")
.buildSkill("Emission laser")
.billdWeapon("Laser Cannon")
.build();
//打印角色属性面板
characters.showCharacterBoard();
}
}

输出结果:

1
2
3
Connected to the target VM, address: '127.0.0.1:57347', transport: 'socket'
人物 : jack 年龄 :18 性别:man 技能:Emission laser 武器:Laser Cannon
Disconnected from the target VM, address: '127.0.0.1:57347', transport: 'socket'
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之建造者模式

文章作者:NanYin

发布时间:2019年06月01日 - 12:06

最后更新:2020年08月02日 - 21:08

原始链接:https://nanyiniu.github.io/2019/06/01/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。