深入理解23种设计模式(4) -- 建造者模式 介绍 案例

@[toc]

介绍

  1. 建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式,它可以将复制的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同的属性
  2. 建造者模式是一步步创建一个复制的对象,它允许用户只通过指定复制对象的类型和内容就可以构建它们,用户不需要指定细节

在这里插入图片描述

  • Product(产品角色): 一个具体的产品对象
  • Builder (抽象建造者):创建一个Product对象的各个不见指定的接口/抽象类
  • ConcreteBuilder (具体建造这):实现接口,构造和装配各个部件
  • Diretor(指挥者):构建一个使用builder接口的对象,它主要是用于创建一个复杂的对象,它主要又2个作用,一是:隔离了客户与对象的生辰过程,二是:负责控制产品对象的生产过程。

案例

盖房子需求:

  1. 需要建房子,这一过程为打桩、砌墙、封顶
  2. 房子各种各样的,比如普通房,高楼,别墅,各种房子过程虽然一样,但是要求不要相同

新建抽象类 AbstractHouse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
java复制代码public abstract class AbstractHouse {

//打地基
public abstract void buildBasic();

//砌墙
public abstract void buildWalls();

//封顶
public abstract void roofed();

public void build() {
buildBasic();
buildWalls();
roofed();
}
}

构建普通房子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java复制代码public class CommonHouse extends AbstractHouse{
@Override
public void buildBasic() {
System.out.println("打地基。。。。");
}

@Override
public void buildWalls() {
System.out.println("砌墙。。。。");
}

@Override
public void roofed() {
System.out.println("封顶。。。。");
}
}

测试Clinet

1
2
3
4
5
6
java复制代码public class Client {
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
commonHouse.build();
}
}

在这里插入图片描述

传统方式解决

  1. 优点好理解,简单
  2. 设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,耦合度增强了

使用建造者模式

新建House 产品

1
2
3
4
5
6
7
java复制代码@Data
public class House {
private String baise;
private String wall;
private String roofed;

}

抽象类 HouseBuilder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
java复制代码public abstract class HouseBuilder {

protected House house = new House();

//打地基
public abstract void buildBasic();

//砌墙
public abstract void buildWalls();

//封顶
public abstract void roofed();

//建造房子
public House buildHouse() {
return house;
}
}

普通房子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java复制代码public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("打地基5m。。。。");
}

@Override
public void buildWalls() {
System.out.println("砌墙5m。。。。");
}

@Override
public void roofed() {
System.out.println("封顶5m。。。。");
}
}

高楼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java复制代码public class HignBuilding extends HouseBuilder{
@Override
public void buildBasic() {
System.out.println("高楼地基100m");
}

@Override
public void buildWalls() {
System.out.println("高楼砌墙100m");
}

@Override
public void roofed() {
System.out.println("高楼封顶100m");
}
}

指挥者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
java复制代码public class HouseDirector {
HouseBuilder houseBuilder = null;

//构造器传入
public HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}

//setter传入
public void setHouseBuilder(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}


//如何处理建造房子流程,交给指挥者
public House constructHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
java复制代码public class Client {
public static void main(String[] args) {
//普通房子
CommonHouse commonHouse = new CommonHouse();
HouseDirector houseDirector = new HouseDirector(commonHouse);
House house = houseDirector.constructHouse();

HignBuilding hignBuilding = new HignBuilding();
HouseDirector houseDirector2 = new HouseDirector(hignBuilding);
houseDirector2.constructHouse();
}
}

在这里插入图片描述

优点和缺点

优点:

1
2
复制代码1)封装性。是客户端不必知道产品内部组成的细节。
2)便于控制细节风险。可以对建造过程逐步细化,而不对其他模块产生任何影响。

缺点:

1
2
复制代码 1)如果内部变化复杂,会有很多建造类。
2)产品必须有共同点,范围有限制。

适用场景:

1
2
复制代码 1) 多个部件或零件,都可以装配到一个对象中,但产生的结果又不相同时。
2)需要生成的对象具有复杂的内部结构时。

在我们JDK 中 java.lang.StringBuilder中就使用了 建造者模式


github Demo地址 : ~~~传送门~~~

个人博客地址:blog.yanxiaolong.cn/

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%