第三课:建造者模式 | 创建型模式
大家好,欢迎来到风筝的设计模式专栏,我相信快节奏的生活下,文字的力量依然强大!
今天是第三课----建造者模式。
什么是建造者模式?
建造者模式(Builder Pattern)是一种创建型设计模式,用于将复杂对象的创建过程分离出来,使得相同的构建过程可以创建不同的表示形式。
该模式适用于需要创建复杂对象的场景,复杂对象由多个部件组成,这些部件可能是按照一定的顺序或方式组合而成的。使用建造者模式可以将构建复杂对象的过程分解为若干个简单对象的构建过程,并且可以灵活组合这些简单对象构成复杂对象,从而使得对象的创建过程更加灵活、可扩展。
建造者模式的核心思想是将对象的创建和表示分离,使用一个指挥者(Director)来指导具体的构建过程,使用建造者(Builder)来构建各个部件,最后由指挥者组装各个部件构成完整的复杂对象。这种分离可以使得同样的构建过程可以创建出不同的表示形式,也使得增加新的表示形式变得容易。
建造者模式的主要参与者有:
- Builder(建造者):定义用于构建产品的接口,包括各个部件的构建方法。
- ConcreteBuilder(具体建造者):实现Builder接口,定义具体的构建过程,并返回构建完成的产品实例。
- Director(指挥者):调用Builder的接口来构建产品,并最终返回构建完成的产品实例。
- Product(产品):由多个部件组成的复杂对象,由ConcreteBuilder构建而成。
产品是建造者模式中所要构建的复杂对象,包含了多个部分,每个部分都有自己的属性和行为。建造者则是产品的构建者,它知道如何创建每个部分,以及如何将这些部分组合成一个完整的产品。指挥者负责控制建造者的构建过程,按照一定的步骤和规则组合各个部分,最终得到一个完整的产品。客户端则是使用建造者模式的调用方,它通过指挥者调用建造者的构建方法,得到构建完成的产品。
建造者模式的优点在于,它将产品的构建过程和表示分离,使得产品的构建过程可以更加灵活,而不会对客户端造成影响。同时,建造者模式可以逐步构建复杂的产品,每一步都有一个具体的实现,使得代码更加清晰易懂,便于维护和扩展。此外,建造者模式还可以防止产品被不完整或不正确地构建,从而提高代码的可靠性和安全性。
特点
建造者模式与工厂模式的最大不同在于,建造者模式着重于组装复杂对象,而工厂模式则着重于创建单个对象。在建造者模式中,对象的构建过程是分步进行的,每一步都有一个建造者对象来负责。最终,所有的步骤都完成后,建造者对象会将最终的对象返回给客户端。
另外,建造者模式也常常与抽象工厂模式混淆,因为它们都可以用于创建复杂的对象。但是,它们的区别在于抽象工厂模式强调的是创建一系列相关的对象,而建造者模式则强调创建一个复杂对象的各个部分,并通过组装这些部分来创建最终的对象。
实现方法
建造者模式通常涉及创建一个包含多个方法的类,这些方法用于配置对象的不同组成部分。该类通常也包括一个名为“构造”的方法,该方法将使用之前配置的方法来创建对象。
首先是产品类 Computer
:
public class Computer {
private String cpu;
private String gpu;
private int memorySize;
private int storageSize;
public Computer(String cpu, String gpu, int memorySize, int storageSize) {
this.cpu = cpu;
this.gpu = gpu;
this.memorySize = memorySize;
this.storageSize = storageSize;
}
// getter methods
}
然后是建造者接口 ComputerBuilder
:
public interface ComputerBuilder {
public void setCpu(String cpu);
public void setGpu(String gpu);
public void setMemorySize(int memorySize);
public void setStorageSize(int storageSize);
public Computer getComputer();
}
接下来是具体的建造者类 GamingComputerBuilder
:
public class GamingComputerBuilder implements ComputerBuilder {
private Computer computer;
public GamingComputerBuilder() {
this.computer = new Computer("", "", 0, 0);
}
@Override
public void setCpu(String cpu) {
this.computer.setCpu(cpu);
}
@Override
public void setGpu(String gpu) {
this.computer.setGpu(gpu);
}
@Override
public void setMemorySize(int memorySize) {
this.computer.setMemorySize(memorySize);
}
@Override
public void setStorageSize(int storageSize) {
this.computer.setStorageSize(storageSize);
}
@Override
public Computer getComputer() {
return this.computer;
}
}
同样地,我们还需要实现一个 OfficeComputerBuilder
类,与 GamingComputerBuilder
类似。
接下来是指挥者类 ComputerDirector
:
public class ComputerDirector {
private ComputerBuilder builder;
public ComputerDirector(ComputerBuilder builder) {
this.builder = builder;
}
public void constructComputer() {
builder.setCpu("Intel Core i7");
builder.setGpu("Nvidia RTX 3070");
builder.setMemorySize(16);
builder.setStorageSize(1000);
}
}
最后,我们可以在 Main
函数中使用建造者模式构造一台游戏电脑:
public class Main {
public static void main(String[] args) {
ComputerBuilder builder = new GamingComputerBuilder();
ComputerDirector director = new ComputerDirector(builder);
director.constructComputer();
Computer computer = builder.getComputer();
System.out.println("CPU: " + computer.getCpu());
System.out.println("GPU: " + computer.getGpu());
System.out.println("Memory Size: " + computer.getMemorySize() + " GB");
System.out.println("Storage Size: " + computer.getStorageSize() + " GB");
}
}
运行结果:
CPU: Intel Core i7
GPU: Nvidia RTX 3070
Memory Size: 16 GB
Storage Size: 1000 GB
以上就是建造者模式的完整实现。使用建造者模式可以使得代码具有更好的可读性和可维护性,同时也可以方便地构建具有复杂参数的对象。
建造者模式的优缺点
优点
- 客户端不必知道产品内部的具体细节,将产品的创建和组装进行分离,使得同样的创建过程可以构建不同的产品。
- 可以更加精细地控制产品的创建过程,从而提高代码的可维护性、扩展性和灵活性。
- 可以降低代码的复杂度,提高系统的整体设计质量。
缺点
- 建造者模式中需要创建多个对象,因此会消耗一定的内存空间和时间,尤其是创建复杂对象时,建造者模式的性能优势比较明显。
- 如果产品的组成部分过于复杂,需要定义很多的建造者类才能完成产品的创建,这样会增加系统的理解和维护难度。
- 建造者模式需要使用多个对象,因此在一定程度上增加了系统的复杂度和设计难度。
适用场景
- 需要创建的对象具有复杂的内部结构,需要通过一个步骤一步完成。
- 需要构建的产品对象具有复杂的创建过程,需要分步骤构建。
- 需要更加精细地控制产品对象的创建过程,实现产品的定制化构建。
转载自:https://juejin.cn/post/7227003532480954424