博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
文章目录
- 1、什么是建造者模式
- 2、建造者模式有什么优缺点
- 3、建造者模式的应用场景
- 4、建造者模式的结构
- 5、建造者模式的代码案例
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
💕💕喜欢的话记得点赞收藏啊