设计模式:建造者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

news2024/12/24 20:23:56

上一篇《策略模式》                                                       下一篇《适配器模式》

简介:

建造者模式,它是一种对象构建模式,它提供了一种构建对象的最佳方式。这种模式适用于当对象的构建过程需要涉及到多个部分,并且这些部分在构造过程中可以逐步完善。
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式将对象的创建过程抽象化,通过将对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式主要涉及四个角色:
1、产品角色(Product)是一个具体的产品对象,它包含了产品对象的各个部分。
2、抽象建造者(Builder)为创建一个产品对象的各个部件指定抽象接口,它定义了产品对象的各个部分,并提供了一种构建和装配各个部件的方法。
3、具体建造者(ConcreteBuilder)实现抽象建造者接口,构造和装配产品的各个部件,定义并明确它所创建的表示,并提供一个返回这个产品的接口。
4、指挥者(Director)构建一个使用Builder接口的对象。

使用建造者模式可以隔离客户与对象的生产过程,同时负责控制产品对象的生产过程。这种模式使得用户只需要通过指定复杂对象的类型和内容就可以构建它们,而不需要了解内部具体的构建细节。

总的来说,建造者模式是一种灵活且可维护的模式,它使得对象构建过程更加清晰和易于理解。

建造者模式的使用场景:
1、相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用建造者模式。
3、产品类非常复杂,或者产品类中调用顺序不同产生了不同的效果时,可以采用建造者模式。
4、在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式。

建造者模式的创建步骤:
1、创建一个指挥者类,该类负责调用建造者类来构建复杂对象。
2、创建一个抽象建造者类,该类定义了复杂对象的各个部件,以及如何构建这些部件。
3、创建一个具体建造者类,该类实现了抽象建造者类中定义的方法,以构建并返回复杂对象。
4、在客户端代码中,使用指挥者类来创建具体建造者类的实例,然后通过指挥者类来调用具体建造者类的方法,以构建复杂对象。

以上是建造者模式的基本创建步骤,您可以根据实际情况进行调整和扩展。

建造者模式的优点,主要包括:
1、将一个复杂对象的建造过程与其表示过程分离,使得同样的构建过程可以创建不同的表示。
2、客户端不必知道产品对象的内部组成,使得构建过程更加灵活。
3、将复杂对象的创建过程分解在不同的方法中,使得创建过程更加清晰,更方便使用程序来控制创建过程。
4、各个具体建造者相互独立,有利于系统的解耦。
5、指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。

建造者模式的缺点,主要包括:
1、产品的组成部分必须相同,这限制了其使用范围。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。


示例:

一、C#建造者模式

下面是一个使用C#实现建造者模式的示例:

// 产品类  
public class Car  
{  
    public string Name { get; set; }  
    public int Seats { get; set; }  
    public string Transmission { get; set; }  
    public string Engine { get; set; }  
  
    public override string ToString()  
    {  
        return $"{Name} ({Seats} seats, {Transmission}, {Engine})";  
    }  
}  
  
// 抽象建造者类  
public abstract class CarBuilder  
{  
    public abstract void SetBody();  
    public abstract void SetWindows();  
    public abstract void SetDoors();  
    public abstract Car GetCar();  
}  
  
// 具体建造者类1  
public class CarBuilderA : CarBuilder  
{  
    private Car _car = new Car();  
  
    public override void SetBody()  
    {  
        _car.Name = "CarA";  
        _car.Seats = 4;  
        _car.Transmission = "Automatic";  
        _car.Engine = "Petrol";  
    }  
  
    public override void SetWindows()  
    {  
        // Add windows to the car body  
    }  
  
    public override void SetDoors()  
    {  
        // Add doors to the car body  
    }  
  
    public override Car GetCar()  
    {  
        return _car;  
    }  
}  
  
// 具体建造者类2  
public class CarBuilderB : CarBuilder  
{  
    private Car _car = new Car();  
  
    public override void SetBody()  
    {  
        _car.Name = "CarB";  
        _car.Seats = 2;  
        _car.Transmission = "Manual";  
        _car.Engine = "Electric";  
    }  
  
    public override void SetWindows()  
    {  
        // Add windows to the car body  
    }  
  
    public override void SetDoors()  
    {  
        // Add doors to the car body  
    }  
  
    public override Car GetCar()  
    {  
        return _car;  
    }  
}

二、java建造者模式

建造者模式通常通过以下方式实现:

// 产品类  
public class Car {  
    private String name;  
    private int seats;  
    private String transmission;  
    private String engine;  
  
    public Car(String name, int seats, String transmission, String engine) {  
        this.name = name;  
        this.seats = seats;  
        this.transmission = transmission;  
        this.engine = engine;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public int getSeats() {  
        return seats;  
    }  
  
    public String getTransmission() {  
        return transmission;  
    }  
  
    public String getEngine() {  
        return engine;  
    }  
}  
  
// 抽象建造者类  
public abstract class CarBuilder {  
    public abstract void setBody();  
    public abstract void setWindows();  
    public abstract void setDoors();  
    public abstract Car getCar();  
}  
  
// 具体建造者类1  
public class CarBuilderA extends CarBuilder {  
    private Car car = new Car("CarA", 4, "Automatic", "Petrol");  
  
    @Override  
    public void setBody() {  
        // Add body to the car  
    }  
  
    @Override  
    public void setWindows() {  
        // Add windows to the car body  
    }  
  
    @Override  
    public void setDoors() {  
        // Add doors to the car body  
    }  
  
    @Override  
    public Car getCar() {  
        return car;  
    }  
}  
  
// 具体建造者类2  
public class CarBuilderB extends CarBuilder {  
    private Car car = new Car("CarB", 2, "Manual", "Electric");  
  
    @Override  
    public void setBody() {  
        // Add body to the car  
    }  
  
    @Override  
    public void setWindows() {  
        // Add windows to the car body  
    }  
  
    @Override  
    public void setDoors() {  
        // Add doors to the car body  
    }  
  
    @Override  
    public Car getCar() {  
        return car;  
    }  
}

三、javascript建造者模式

在JavaScript中,建造者实现方式如下:

// 产品类  
function Car(name, seats, transmission, engine) {  
  this.name = name;  
  this.seats = seats;  
  this.transmission = transmission;  
  this.engine = engine;  
}  
  
// 抽象建造者类  
function CarBuilder() {}  
  
// 具体建造者类1  
function CarBuilderA() {  
  this.car = new Car();  
}  
  
CarBuilderA.prototype.setBody = function(body) {  
  // Add body to the car  
  this.car.name = body;  
};  
  
CarBuilderA.prototype.setWindows = function(windows) {  
  // Add windows to the car body  
  this.car.seats = windows;  
};  
  
CarBuilderA.prototype.setDoors = function(doors) {  
  // Add doors to the car body  
  this.car.transmission = doors;  
};  
  
CarBuilderA.prototype.getCar = function() {  
  return this.car;  
};  
  
// 具体建造者类2  
function CarBuilderB() {  
  this.car = new Car();  
}  
  
CarBuilderB.prototype.setBody = function(body) {  
  // Add body to the car  
  this.car.name = body;  
};  
  
CarBuilderB.prototype.setWindows = function(windows) {  
  // Add windows to the car body  
  this.car.seats = windows;  
};  
  
CarBuilderB.prototype.setDoors = function(doors) {  
  // Add doors to the car body  
  this.car.transmission = doors;  
};  
  
CarBuilderB.prototype.getCar = function() {  
  return this.car;  
};

四、C++建造者模式

以下是在C++中实现建造者模式:

#include <iostream>  
#include <string>  
  
// 产品类  
class Car {  
public:  
    void setBody(const std::string& body) {  
        m_body = body;  
    }  
  
    void setWindows(const std::string& windows) {  
        m_windows = windows;  
    }  
  
    void setDoors(const std::string& doors) {  
        m_doors = doors;  
    }  
  
    void printCar() const {  
        std::cout << "Car: " << m_body << ", Windows: " << m_windows << ", Doors: " << m_doors << std::endl;  
    }  
  
private:  
    std::string m_body;  
    std::string m_windows;  
    std::string m_doors;  
};  
  
// 抽象建造者类  
class CarBuilder {  
public:  
    virtual ~CarBuilder() {}  
  
    virtual void setBody() = 0;  
    virtual void setWindows() = 0;  
    virtual void setDoors() = 0;  
    virtual Car* getCar() = 0;  
};  
  
// 具体建造者类1  
class CarBuilderA : public CarBuilder {  
public:  
    void setBody() {  
        m_car->setBody("CarA Body");  
    }  
  
    void setWindows() {  
        m_car->setWindows("CarA Windows");  
    }  
  
    void setDoors() {  
        m_car->setDoors("CarA Doors");  
    }  
  
    Car* getCar() {  
        return m_car;  
    }  
  
private:  
    Car* m_car;  
};  
  
// 具体建造者类2  
class CarBuilderB : public CarBuilder {  
public:  
    void setBody() {  
        m_car->setBody("CarB Body");  
    }  
  
    void setWindows() {  
        m_car->setWindows("CarB Windows");  
    }  
  
    void setDoors() {  
        m_car->setDoors("CarB Doors");  
    }  
  
    Car* getCar() {  
        return m_car;  
    }  
  
private:  
    Car* m_car;  
};  
  
// 客户端代码  
int main() {  
    // 使用CarBuilderA构建一辆汽车并输出信息  
    CarBuilderA builderA;  
    builderA.setBody();  
    builderA.setWindows();  
    builderA.setDoors();  
    Car* carA = builderA.getCar();  
    carA->printCar();  
}

五、python建造者模式

在Python中,建造者模式通常使用类来构建对象。下面是一个使用Python实现建造者模式的示例:

class Car:  
    def __init__(self):  
        self.body = ""  
        self.windows = ""  
        self.doors = ""  
  
    def set_body(self, body):  
        self.body = body  
  
    def set_windows(self, windows):  
        self.windows = windows  
  
    def set_doors(self, doors):  
        self.doors = doors  
  
    def print_car(self):  
        print("Car: {}, Windows: {}, Doors: {}".format(self.body, self.windows, self.doors))  
  
  
class CarBuilder:  
    def __init__(self):  
        self.car = Car()  
  
    def set_body(self):  
        self.car.set_body("Car Body")  
  
    def set_windows(self):  
        self.car.set_windows("Car Windows")  
  
    def set_doors(self):  
        self.car.set_doors("Car Doors")  
  
    def get_car(self):  
        return self.car  
  
  
# 客户端代码  
if __name__ == "__main__":  
    builder = CarBuilder()  
    builder.set_body()  
    builder.set_windows()  
    builder.set_doors()  
    car = builder.get_car()  
    car.print_car()

六、go建造者模式

在Go语言中,建造者模式通常使用结构体和方法来实现。下面是一个使用Go实现建造者模式的示例:

package main  
  
import "fmt"  
  
// Product接口定义产品的行为  
type Product interface {  
 Use()  
}  
  
// ConcreteProduct是Product接口的具体实现  
type ConcreteProduct struct {  
 // 产品的属性  
}  
  
// Use是Product接口的具体实现方法  
func (p *ConcreteProduct) Use() {  
 fmt.Println("使用产品")  
}  
  
// Builder接口定义构建者的行为  
type Builder interface {  
 SetPartA()  
 SetPartB()  
 SetPartC()  
 GetProduct() Product  
}  
  
// ConcreteBuilder是Builder接口的具体实现  
type ConcreteBuilder struct {  
 product *ConcreteProduct  
}  
  
// SetPartA是Builder接口的具体实现方法  
func (b *ConcreteBuilder) SetPartA() {  
 // 构建产品的部分A  
}  
  
// SetPartB是Builder接口的具体实现方法  
func (b *ConcreteBuilder) SetPartB() {  
 // 构建产品的部分B  
}  
  
// SetPartC是Builder接口的具体实现方法  
func (b *ConcreteBuilder) SetPartC() {  
 // 构建产品的部分C  
}  
  
// GetProduct是Builder接口的具体实现方法,返回最终的产品  
func (b *ConcreteBuilder) GetProduct() Product {  
 return b.product  
}  
  
func main() {  
 // 创建具体的构建者对象  
 builder := &ConcreteBuilder{}  
   
 // 使用构建者构建产品对象,并使用产品对象的方法进行操作。  
 builder.SetPartA() 
}

七、PHP建造者模式

下面是一个使用PHP实现建造者模式的示例:

<?php  
  
// 产品接口  
interface Product {  
    public function useProduct();  
}  
  
// 具体产品实现  
class ConcreteProduct implements Product {  
    public function useProduct() {  
        echo "使用产品";  
    }  
}  
  
// 建造者接口  
interface Builder {  
    public function setPartA();  
    public function setPartB();  
    public function setPartC();  
    public function getProduct();  
}  
  
// 具体建造者实现  
class ConcreteBuilder implements Builder {  
    private $product;  
      
    public function setPartA() {  
        // 构建产品的部分A,并进行适当的设置(比如组装或配置)工作。  
        // 具体细节对用户来说是不可见的。用户只是调用builder的方法进行设置,而不需要关心具体是如何实现的。这就是封装。  
        // 封装是面向对象编程的三大特性之一,它提供了隐藏对象内部状态并仅通过对象提供的方法来访问的能力。封装可以防止用户直接访问对象内部状态,从而防止修改对象内部状态导致的问题。封装还可以隐藏对象的实现细节,从而提高了代码的安全性和可维护性。  
    }  
      
    public function setPartB() {  
        // 构建产品的部分B,并进行适当的设置(比如组装或配置)工作。  
    }  
      
    public function setPartC() {  
        // 构建产品的部分C,并进行适当的设置(比如组装或配置)工作。  
    }  
      
    public function getProduct() {  
        return $this->product; // 返回最终的产品对象。  
    }  
}  
  
// 使用建造者模式构建对象并使用其方法进行操作。  
$builder = new ConcreteBuilder();  
$builder->setPartA(); 

《完结》

上一篇《策略模式》                                                        下一篇《适配器模式》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1127108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

观察者模式 vs 发布-订阅模式:两种设计模式的对决!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

设备标识牌不锈钢二维码制作

一、设备标识牌二维码好处&#xff1a; 1、设备信息管理&#xff1a;传统标识牌容纳的信息有限&#xff0c;将二维码用于设备标识牌&#xff0c;可实现设备信息丰富展示、设备文档资料可存储二维码云端、微信扫码检查查阅&#xff0c;无需携带纸质&#xff0c;同时凡尔码云端后…

JSX 动态类名控制

学习目标&#xff1a; 根据需求判断是否显示某个类名的样式 实现&#xff1a; 使用三元表达式或逻辑&&运算 import ./app.css; function App() {const color1 trueconst color2 truereturn (<div className"App">1. 三元&#xff1a;<div classN…

android项目实践说明

权限与存储 本地读取文件&#xff08;IO流&#xff09; 网络传输&#xff08;Socket通信&#xff09; 串口通信&#xff08;串行传输接口通信&#xff09; 而串口通信是应用在智能家居和单片机通信的场景&#xff0c;人脸识别门禁&#xff0c;利用串口控制门开关&#xff0…

SHELL基础编程

文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()的应用…

leetcode 29

dividend 和 divisor都是int 类型&#xff0c;返回值也是int类型&#xff0c; 在C中&#xff0c;int类型表示整数类型&#xff0c;其范围取决于具体的实现。通常情况下&#xff0c;int类型的范围为-2147483648到2147483647&#xff0c;即-231到231-1。这是因为int类型通常为32…

Fwupd 1.9.6 Linux 固件升级工具已于近日发布

导读Fwupd 1.9.6 Linux 固件升级工具已于近日发布&#xff0c;支持更多硬件设备、新功能和十几处错误修复。 Fwupd 1.9.6 是在 fwupd 1.9.5 发布一个月后推出的&#xff0c;它引入了对更多硬件设备的支持&#xff0c;包括 AMD dGPUs Navi3x 及更高版本、Star Labs StarBook Mk …

假脸检测:Exploring Decision-based Black-box Attacks on Face Forgery Detection

论文作者&#xff1a;Zhaoyu Chen,Bo Li,Kaixun Jiang,Shuang Wu,Shouhong Ding,Wenqiang Zhang 作者单位&#xff1a;Fudan University;Yiwu Research Institute of Fudan University 论文链接&#xff1a;http://arxiv.org/abs/2310.12017v1 内容简介&#xff1a; 1&…

GeoServer改造Springboot源码二(数据源管理设计)

一、界面设计 图 1数据源管理列表 图 2选择数据源类型 1、PostGis 图 3新增PostGis数据源 2、Shapefile

Delay问题分析

【在刚刚过去的SAFe Scrum Master课程上有学员提出了Delay问题&#xff0c;进行了重点分析&#xff0c;颇有意义&#xff0c;因此整理得到本文】 大致背景情况&#xff1a;To B软件开发&#xff0c;已经启用了敏捷开发&#xff0c;迭代周期2周。 问题&#xff1a;经常出现Del…

因修改 MySQL 复制账号密码导致主从复制中断

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路&#xff08;ID: JiekeXu_IT&#xff09; 如需转载请联系授权 | (个人微信 ID&#xff1a;JiekeXu_DBA) 大家好&#xff0c;我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看因修改 MySQL 复制账号密码导致主从复制异常&am…

Go语音中并发介绍

Go 是一种并发语言&#xff0c;而不是并行语言。在讨论 Go 中如何处理并发之前&#xff0c;我们必须首先了解什么是并发以及它与并行有何不同。 什么是并发&#xff1f; 并发性是指同时处理很多事情的能力。最好用一个例子来解释。 让我们考虑一个人慢跑。假设他早上慢跑时&…

电子画册如何制作,教你几分钟简单上手制作?

电子画册不同于纸质画册&#xff0c;它可以不受时间、空间及地域的限制&#xff0c;以更直观、新颖的形式展示在读者面前&#xff0c;还能快速传播效益。所以&#xff0c;当下&#xff0c;越来越多人想要用电子画册来传递内容信息。 如何制作电子画册&#xff1f;其实只要使用…

GoLong的学习之路(六)语法之指针

书接上回&#xff0c;上回书中写道&#xff0c;数组已经和java中数组的区别。在go中数组的是数值类型&#xff0c;故需要指针指向数组的地址&#xff0c;从而进行修改。这次诉说&#xff0c;指针 文章目录 指针指针地址new和makenewmake 指针 区别于C/C中的指针&#xff0c;G…

公立医院绩效考核系统源码,能适应医院多种绩效核算方式,技术架构:springboot、mybaits +avue +MySQL

医院绩效考核系统源码 &#xff0c;绩效核算系统全套成品源码&#xff08;有医院项目应用案例&#xff09;可适应医院多种绩效核算方式。 系统概述&#xff1a; 医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用…

从零开始学习wpsjs

1.这是一个简单的wpsjs学习文档&#xff0c;我是边学习wpsjs边记录学习的&#xff0c;希望对您的学习有所帮助 开发事项&#xff1a; 全局安装wpsjs:npm install -g wpsjsWpsjs create HelloWps 安装wps npm install -g wpsjs 新建一个wps加载项 输入命令wpsjs create HelloW…

代码随想录算法训练营第三十一天丨 贪心算法part02

122.买卖股票的最佳时机 II 思路 本题首先要理清楚两点&#xff1a; 只有一只股票&#xff01;当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 #贪心算法 这道题目可能我们只会想&#xff0c;选一个低的买入&#xff0c;再选个高的卖&#xff0c;…

LoongArch 指令集实验exp6

在借鉴了友佬的代码后&#xff0c;终于是跑通了测试。 1. 2. 4. 5. 6. 还需要改一个&#xff08;&#xff09; assign sr64_result {{32{op_sra & alu_src1[31]}}, alu_src1[31:0]} >> alu_src2[4:0]; //rj >> i5

Panoply启动报错A Java Exception has occurred

Panoply启动报错A Java Exception has occurred 问题描述 原因 可能是版本不对&#xff0c;目前panoly只支持java11以后的了&#xff0c;我的java是8的&#xff0c;需要升级。 解决方案 删除原有的Java8重新安装Java11之后&#xff0c;即打开成功 安装Java11步骤

抓取网页的含义和URL基本构成

抓取网页是指通过爬虫程序从互联网上获取网页的内容和数据。抓取网页是爬虫的核心功能之一&#xff0c;通过抓取网页&#xff0c;可以获取到网页中的文本、图片、链接等信息&#xff0c;用于后续的数据分析、挖掘和应用。 URL&#xff08;Uniform Resource Locator&#xff09…