创建型模式-建造者模式

devtools/2024/11/29 6:42:30/

建造者模式(Builder Pattern)是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。

核心思想

将复杂对象的创建步骤分解开来,通过一步步的构建来完成对象的创建,隐藏构建的具体细节,从而使构造过程更加灵活。

组成

  • Builder(抽象建造者)
    定义用于创建产品各部分的接口。

  • ConcreteBuilder(具体建造者)
    实现抽象建造者接口,完成产品的具体部分构造。

  • Product(产品类)
    表示复杂对象,包含多个组成部分。

  • Director(指挥者)
    调用建造者中的方法按特定顺序来构建产品。

优缺点

  • 优点
    分离复杂构建过程与表示:提高代码的清晰性和可维护性。
    易于扩展:可以通过添加新的具体建造者来扩展创建流程。
    细节控制:通过指挥者可以按特定步骤控制产品的创建顺序。
  • 缺点
    生成器类的数量可能会增加,增加代码复杂度。
    不适用于构造过程过于简单的场景。
    代码实现示例
    假设要创建一辆汽车,每辆车由车轮、发动机、车身等部分组成。
java">// 产品类
public class Car {private String engine;private String wheels;private String body;// Getter 和 Setterpublic void setEngine(String engine) {this.engine = engine;}public void setWheels(String wheels) {this.wheels = wheels;}public void setBody(String body) {this.body = body;}@Overridepublic String toString() {return "Car [engine=" + engine + ", wheels=" + wheels + ", body=" + body + "]";}
}
// 抽象建造者
public interface CarBuilder {void buildEngine();void buildWheels();void buildBody();Car getCar(); // 返回建造好的产品
}
// 具体建造者
public class SportsCarBuilder implements CarBuilder {private Car car;public SportsCarBuilder() {this.car = new Car();}@Overridepublic void buildEngine() {car.setEngine("V8 Engine");}@Overridepublic void buildWheels() {car.setWheels("Sports Wheels");}@Overridepublic void buildBody() {car.setBody("Sleek Sports Body");}@Overridepublic Car getCar() {return car;}
}
// 指挥者
public class Director {private CarBuilder builder;public Director(CarBuilder builder) {this.builder = builder;}public Car constructCar() {builder.buildEngine();builder.buildWheels();builder.buildBody();return builder.getCar();}
}
//客户端测试
public class Main {public static void main(String[] args) {// 创建具体建造者CarBuilder sportsCarBuilder = new SportsCarBuilder();// 指挥者控制构建过程Director director = new Director(sportsCarBuilder);// 构建产品Car sportsCar = director.constructCar();// 输出结果System.out.println(sportsCar);}
}

建造者模式适用场景

  • 复杂对象的创建:当一个对象的创建涉及多个部分且需要特定顺序时。
  • 多种构造方式:需要为同一产品创建不同的表示。
  • 隔离创建细节:需要隐藏产品的构建细节时。
  • 如果你需要进一步探索建造者模式的高级用法或其他设计模式,随时告诉我!

http://www.ppmy.cn/devtools/137851.html

相关文章

python+docx:(二)页眉页脚、表格操作

目录 页眉页脚 表格 表格样式 插入表格 插入行/列 合并单元格 单元格 页眉页脚 页眉页脚操作需要访问文件的section,可通过添加页脚来添加页码。 from docx import Document from docx.enum.text import WD_PARAGRAPH_ALIGNMENT, WD_ALIGN_PARAGRAPH, WD_CO…

c++类模板成员函数的特化

是的,类成员函数可以是模板函数。在C中,类模板和非模板类都可以包含模板成员函数。这种设计允许类在某些成员函数中具有泛型行为,而不需要将整个类设计为模板。 本文将详细介绍类成员函数作为模板函数的概念、声明和定义方法,以及…

ElasticSearch7.x入门教程之全文搜索(五)

文章目录 前言一、全文查询:match query二、词项查询:term query总结 前言 搜索是 ElasticSearch 最为丰富有趣的功能,也是平常在工作当中用得最多的地方。 我相信,基本上也只是用到ES的搜索,比如全文查询、词项查询…

wxFormBuilder:可视化设计、学习wxWidgets自带UI控件的好工具

wxFormBuilder很快就能拼出一个界面,而且可以直接出对应的代码,拷贝到项目里小改一下就能用。

简单好用的折线图绘制!

折线图的概念及作用: 折线图(Line Chart)是一种常见的图表类型,用于展示数据的变化趋势或时间序列数据。它通过一系列的数据点(通常表示为坐标系中的点)与这些点之间的线段相连,直观地展示变量…

Qt中QML和C++混合编程

使用QML开发界面 加载QML的3种方式 支持文件路径、资源(资源文件)路径,网络路径 使用QQmlApplicationEngine 这个类结合了QQmlEngine和QQmlComponent QGuiApplication app(argc,argv);//1、使用QQmlApplicationEngine加载qml代码&#x…

深入理解React Hooks:使用useState和useEffect

引言 React Hooks是React 16.8引入的一项强大功能,它使函数组件能够使用状态和其他React特性。本文将深入探讨两个最常用的Hooks:useState和useEffect,并通过实际代码示例展示它们的使用方法。 1. 什么是React Hooks? React Ho…

第二章:编写第一个 Go 程序 2.Go 语言的基本结构 --Go 语言轻松入门

Go 语言是一种简洁、高效且易于学习的编程语言,它由Google开发。一个基本的Go程序通常包含以下几个部分: 包声明:在Go中,每个文件都必须属于一个包。最常用的包是main,它表示这个文件可以作为独立的应用程序运行。包声…