Java设计模式:建造者模式
❤ 作者主页:���迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注、点赞、收藏、评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉
文章目录
- 一、建造者模式的定义
- 二、建造者模式的结构
- 三、建造者模式的实现
- 四、建造者模式的优缺点
- 五、建造者模式的使用场景
- 六、建造者模式和工厂模式的区别
一、建造者模式的定义
建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的 构建与表现分离,使得同样的构建过程可以创建不同的表示。
用户只需要指定需要建造的类型就可以得到该类型对应的产品实例,不必关心建造的过程细节,建造者模式就是如何逐步构建包含多个组件的对象,相同的构建过程可以 创建不同的产品。
二、建造者模式的结构
建造者模式包含以下的重要角色:
- 产品(Product): 表示被创建的复杂对象。在建造过程完成后,将返回该产品的实例。
- 抽象建造者(Builder): 定义了构建产品各个部件的抽象接口,具体建造者将实现这个接口以构建和装配产品的各个部件。
- 具体建造者(ConcreteBuilder): 实现了抽象建造者接口,负责具体产品的构建和装配。通常包含一个获取构建结果的方法。
- 指挥者(Director): 调用具体建造者的接口,指导构建过程,只负责保证对象各部分完整创建或者按照指定顺序创建。
三、建造者模式的实现
需求案例:组装一台电脑是一个复杂的过程,它包含了CPU、内存、硬盘等部件的生产,而不同规格型号的部件可以组装成不同配置的计算机,现在我们需要组装基础计算机和高配计算机这两种不同配置的计算机。
使用建造者模式完成上述案例。类图如下:
具体的类设计如下:
产品(计算机):
public class Computer { private String CPU; //CPU private String memory; //内存 private String hardDisk; //硬盘 public void setCPU(String CPU) { this.CPU = CPU; } public void setMemory(String memory) { this.memory = memory; } public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; } @Override public String toString() { return "Computer{" + "CPU='" + CPU + '\'' + ", memory='" + memory + '\'' + ", hardDisk='" + hardDisk + '\'' + '}'; } }
抽象建造者接口:
public abstract class ComputerBuilder { protected Computer computer = new Computer(); public abstract void buildCPU(); public abstract void buildMemory(); public abstract void buildHardDisk(); public abstract Computer createComputer(); }
具体建造者(基础计算机):
public class BasicComputerBuilder extends ComputerBuilder { @Override public void buildCPU() { computer.setCPU("英特尔酷睿i5"); } @Override public void buildMemory() { computer.setMemory("8GB DDR4内存"); } @Override public void buildHardDisk() { computer.setHardDisk("500GB机械硬盘"); } @Override public Computer createComputer() { return computer; } }
具体建造者(高配计算机):
public class HighEndComputerBuilder extends ComputerBuilder { @Override public void buildCPU() { computer.setCPU("英特尔酷睿i9"); } @Override public void buildMemory() { computer.setMemory("32GB DDR4内存"); } @Override public void buildHardDisk() { computer.setHardDisk("1TB固态硬盘"); } @Override public Computer createComputer() { return computer; } }
指挥者:
public class ComputerDirector { private ComputerBuilder computerBuilder; public ComputerDirector(ComputerBuilder computerBuilder) { this.computerBuilder = computerBuilder; } //组装计算机的功能 public Computer construct() { computerBuilder.buildCPU(); computerBuilder.buildMemory(); computerBuilder.buildHardDisk(); return computerBuilder.createComputer(); } }
客户端类:
public class Client { public static void main(String[] args) { //创建指挥者 ComputerDirector computerDirector1 = new ComputerDirector(new BasicComputerBuilder()); //让指挥者创建基础计算机 Computer construct1 = computerDirector1.construct(); System.out.println("组装基础计算机:" + construct1.toString()); //创建指挥者 ComputerDirector computerDirector2 = new ComputerDirector(new HighEndComputerBuilder()); //让指挥者创建高配计算机 Computer construct2 = computerDirector2.construct(); System.out.println("组装高配计算机:" + construct2.toString()); } }
测试结果如下:
可以看到,根据不同的需求,建造者模式构造出不同的计算机对象,不同类型计算机的构建过程都由不同的建造者实现,在构建过程中可定制相应的属性。因为计算机的构建过程和表示分离,所以同样的构建过程可以创建出不同的表示。
四、建造者模式的优缺点
优点:
- 灵活性高: 建造者模式可以灵活地构造复杂对象,通过一步一步的构建过程,可以控制对象的各个部分及其组合方式。
- 可读性好: 建造者模式将对象的构建过程封装在不同的Builder类中,使得客户端代码更易读、更易理解。
- 可维护性强: 由于具体的建造过程都被封装在具体的建造者类中,如果需要修改构建过程,只需修改相应的建造者而不影响其他部分。
- 适用于构建不同表示的对象: 如果需要构建的对象有不同的表示形式,可以使用相同的建造过程构建不同的表示。
缺点:
- 类的膨胀: 使用建造者模式会导致有多个Builder类存在,如果产品的组成部分较少,可能会导致类的膨胀。
- 构建过程必须稳定: 如果产品的构建过程变化较大,那么需要经常修改具体的建造者类,影响系统的稳定性。
- 不适用于不可变对象: 如果需要构建的对象是不可变的,那么建造者模式可能不太适用,因为它是通过一步一步构建可变对象的。
- 依赖关系复杂: 客户端需要知道具体的建造者类,建造者和产品之间的依赖关系较为复杂。
五、建造者模式的使用场景
建造者模式适用于以下场景:
- 创建复杂对象: 当需要创建的对象拥有多个部分或步骤,并且这些部分的组合方式会导致不同的表示形式时,建造者模式非常适用。例如,构建一个包含多个属性的对象,且构建过程比较复杂。
- 构建过程稳定: 如果对象的构建过程相对稳定,但不同的部分可能需要灵活地组合成不同的对象表示,建造者模式可以提供这种灵活性。
- 创建步骤可复用: 如果有多个对象拥有相似的构建步骤,但最终表示不同,可以使用建造者模式。这种情况下,可以通过不同的建造者组合同样的步骤来构建不同的对象。
- 隐藏产品内部细节: 通过建造者模式,可以隐藏产品的内部实现细节,客户端只需关注建造者和指导者的接口而不需要关心具体的产品构建细节。
- 创建对象的算法独立于该对象的组成部分以及它们的装配方式: 如果构建对象的算法与对象的部件以及它们的组装方式独立,建造者模式是一个很好的选择。
六、建造者模式和工厂模式的区别
建造者模式(Builder Pattern):
- 用途: 主要用于构建一个 复杂对象,将构建过程和表示分离,使得同样的构建过程可以创建不同的表示。
- 构建过程: 建造者模式强调的是 一步一步地构建对象,通过指导者(Director)来控制构建的过程,具体的构建过程由不同的建造者(Builder)实现。
- 产品组成: 产品的组成部分可以是 相对独立 的,建造者通过控制这些部分的组装来构建完整的产品。
- 灵活性: 提供了灵活的构建方式,客户端可以根据需要选择不同的建造者和步骤来构建对象。
工厂模式(Factory Pattern):
- 用途: 主要用于创建对象,将对象的创建过程封装在工厂类中,使得客户端无需关心对象的具体创建方式。
- 构建过程: 工厂模式强调的是 直接创建对象,客户端通过工厂类的接口来获取所需对象的实例。
- 产品组成: 工厂模式通常用于创建相对简单的对象,产品的构建过程不复杂。
- 灵活性: 提供了简单的创建方式,客户端只需知道所需对象的接口或类型即可获得实例。
对比:
- 复杂性: 建造者模式更适用于构建复杂对象,而工厂模式更适用于创建相对简单的对象。
- 构建过程控制: 建造者模式通过指导者来控制构建过程,而工厂模式直接创建对象,无需指导者的介入。
- 产品组成独立性: 建造者模式中产品的组成部分可以相对独立,而工厂模式中产品的构建过程相对简单,组成部分可能较为紧密。
- 灵活性: 建造者模式提供了更灵活的构建方式,客户端可以选择不同的建造者和步骤,而工厂模式提供了简单的创建方式。
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!
The End