关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

深入浅出设计模式 - 建造者模式

发布时间:2023-06-27 14:00:55
博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家 Java知识图谱点击链接:体系化学习Java(Java面试专题) 感兴趣的同学可以收藏关注下 ,不然下次找不到哟 1、什么是建造者模式 建造者模式是一种创建型设计模式,它可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式可以通过一步一步地构建复杂对象来简化其构建过程,并且可以在构建过程中灵活地添加或删除组件。建造者模式的核心思想是将对象的构建过程分解为多个步骤,每个步骤由一个具体的建造者来实现,最终由一个指挥者来协调建造者的执行顺序以创建对象。 2、建造者模式有什么优缺点 建造者模式的优点包括: 可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 可以通过一步一步地构建复杂对象来简化其构建过程,并且可以在构建过程中灵活地添加或删除组件。 可以提高代码的复用性,因为不同的建造者可以共享相同的构建过程。 可以提高代码的可读性和可维护性,因为每个具体建造者负责构建一个组件,使得代码更加清晰。 可以避免类爆炸问题,因为不同的组件可以由不同的具体建造者来构建,而不是通过继承来实现。 建造者模式的缺点包括: 建造者模式需要创建多个类,因此会增加代码量。 如果产品的组件非常多,那么建造者模式的构建过程可能会变得非常复杂。 如果产品的组件发生变化,那么需要修改建造者的代码,可能会影响整个系统的稳定性。 建造者模式需要使用指挥者来协调建造者的执行顺序,可能会增加系统的复杂性。 总的来说,建造者模式适用于需要构建复杂对象的场景,可以将构建过程分解为多个步骤,使得代码更加清晰、可维护。但是需要权衡其优缺点,选择合适的设计模式来解决问题。 3、建造者模式的应用场景 建造者模式适用于以下场景: 需要创建复杂对象的场景,例如汽车、电脑、手机等,这些对象的构建过程往往需要多个步骤,并且每个步骤可能有多种实现方式。 需要创建对象的表示与构建过程分离的场景,例如通过 XML 文件或者数据库记录来构建对象。 需要创建不同表示的对象的场景,例如通过相同的构建过程来创建不同的 HTML 页面。 需要在构建过程中灵活地添加或删除组件的场景,例如通过构建器来构建菜单或者表单。 需要提高代码的复用性和可读性的场景,例如通过建造者模式来构建图形用户界面组件。 建造者模式适用于需要构建复杂对象的场景,可以将构建过程分解为多个步骤,使得代码更加清晰、可维护。 4、建造者模式的结构 建造者模式通常包含以下几个角色: 产品(Product):需要被构建的复杂对象,通常由多个组件组成。 抽象建造者(Builder):定义了创建产品各个部件的抽象接口,通常包含多个方法用于构建不同的组件。 具体建造者(ConcreteBuilder):实现了抽象建造者接口,负责具体的产品构建过程,通常包含多个方法用于构建不同的组件。 指挥者(Director):负责协调建造者的执行顺序,以完成产品的构建过程。 5、建造者模式的代码案例 下面是一个简单的建造者模式示例代码:首先定义产品类 Product ,包含多个组件: package com.pany.camp.design.principle.build; /** * * @description: 产品类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-27 12:27 */ public class Product { private String partA; private String partB; private String partC; public void setPartA(String partA) { this.partA = partA; } public void setPartB(String partB) { this.partB = partB; } public void setPartC(String partC) { this.partC = partC; } public void show() { System.out.println("PartA: " + partA); System.out.println("PartB: " + partB); System.out.println("PartC: " + partC); } } 然后定义抽象建造者接口 Builder ,包含多个方法用于构建不同的组件: package com.pany.camp.design.principle.build; /** * * @description: 抽象建造者接口 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-27 12:28 */ public interface Builder { void buildPartA(); void buildPartB(); void buildPartC(); Product getResult(); } 接着定义具体建造者类 ConcreteBuilder ,实现了抽象建造者接口,负责具体的产品构建过程: package com.pany.camp.design.principle.build; /** * * @description: 具体建造者类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-27 12:29 */ public class ConcreteBuilder implements Builder { private Product product = new Product(); @Override public void buildPartA() { product.setPartA("PartA"); } @Override public void buildPartB() { product.setPartB("PartB"); } @Override public void buildPartC() { product.setPartC("PartC"); } @Override public Product getResult() { return product; } } 最后定义指挥者类 Director ,负责协调建造者的执行顺序,以完成产品的构建过程: package com.pany.camp.design.principle.build; /** * * @description: 指挥者类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-27 12:29 */ public class Director { public void construct(Builder builder) { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } 客户端代码可以通过指挥者来构建产品: package com.pany.camp.design.principle.build; /** * * @description: 客户端类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-27 12:30 */ public class Client { public static void main(String[] args) { Director director = new Director(); Builder builder = new ConcreteBuilder(); director.construct(builder); Product product = builder.getResult(); product.show(); } } 我们可以看到建造者模式的核心思想:将复杂对象的构建过程分解为多个步骤,每个步骤由一个具体的建造者来实现,最终由一个指挥者来协调建造者的执行顺序以创建对象,从而实现了复杂对象的构建与表示分离的目的。 输出如下: PartA: PartA PartB: PartB PartC: PartC Process finished with exit code 0 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421喜欢的话记得点赞收藏啊

/template/Home/leiyu/PC/Static