重学设计模式-建造者模式
本文介绍一下建造者模式,相对于工厂模式来说,建造者模式更为简单,且用的更少
定义
建造者模式是一种创建型设计模式,它使用多个简单的对象一步一步构建成一个复杂的对象。这种模式的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
- 当创建复杂对象的过程独立于它们的组成部分以及它们的装配顺序时:可以使用建造者模式来逐步构建复杂对象。
- 当构造过程必须允许被不同创建出来:例如,一个文本文档可能需要根据不同的格式(如HTML、纯文本等)来创建。
- 当类具有强制的分阶段创建过程时:例如,某些产品可能需要先安装基础部分,然后再添加可选的额外功能。
建造者模式主要有四个主体:
- 抽象建造者 Builder:相当于建筑蓝图,声明了创建 Product 对象的各个部件指定的抽象接口。
- 具体建造者 ConcreteBuilder:实现Builder抽象接口,构建和装配各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
- 指挥者 Director:构建一个使用 Builder 接口的对象。主要有两个作用,一是隔离用户与对象的生产过程,二是负责控制产品对象的生产过程。
- 产品角色 Product:被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
代码示例:
// 定义产品类
class House {
private List<String> parts = new ArrayList<>();
public void addPart(String part) {
parts.add(part);
}
public void show() {
for (String part : parts) {
System.out.print(part + " ");
}
System.out.println();
}
}
// 定义抽象建造者
abstract class HouseBuilder {
protected House house;
public abstract void buildBase();
public abstract void buildWalls();
public abstract void buildRoof();
public abstract void buildWindows();
public abstract House getResult();
}
// 具体建造者A
class ConcreteHouseBuilderA extends HouseBuilder {
public ConcreteHouseBuilderA() {
this.house = new House();
}
@Override
public void buildBase() {
house.addPart("Base");
}
@Override
public void buildWalls() {
house.addPart("Walls");
}
@Override
public void buildRoof() {
house.addPart("Roof");
}
@Override
public void buildWindows() {
house.addPart("Windows");
}
@Override
public House getResult() {
return house;
}
}
// 具体建造者B
class ConcreteHouseBuilderB extends HouseBuilder {
public ConcreteHouseBuilderB() {
this.house = new House();
}
@Override
public void buildBase() {
house.addPart("Foundation");
}
@Override
public void buildWalls() {
house.addPart("Side walls");
}
@Override
public void buildRoof() {
house.addPart("Flat roof");
}
@Override
public void buildWindows() {
house.addPart("Large windows");
}
@Override
public House getResult() {
return house;
}
}
// 指挥者
class Director {
public House construct(HouseBuilder builder) {
builder.buildBase();
builder.buildWalls();
builder.buildRoof();
builder.buildWindows();
return builder.getResult();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
Director director = new Director();
// 使用ConcreteHouseBuilderA构建房子
HouseBuilder builderA = new ConcreteHouseBuilderA();
House houseA = director.construct(builderA);
System.out.println("House A:");
houseA.show();
// 使用ConcreteHouseBuilderB构建房子
HouseBuilder builderB = new ConcreteHouseBuilderB();
House houseB = director.construct(builderB);
System.out.println("House B:");
houseB.show();
}
}
在上面的代码中,我们首先定义了一个House
类,它有一个方法add_part
用于添加房子的各个部分,还有一个方法show
用于显示房子的所有部分。然后,我们定义了一个抽象的HouseBuilder
类,它声明了四个方法(build_base
, build_walls
, build_roof
, build_windows
)和一个get_result
方法。接下来,我们实现了两个具体的建造者类ConcreteHouseBuilderA
和ConcreteHouseBuilderB
,它们分别按照不同的方式构建房子。最后,我们定义了一个Director
类,它负责指挥建造者按照一定的步骤构建房子。在客户端代码中,我们创建了两个不同的建造者,并使用同一个导演来构建两种不同类型的房子。