当前位置:网站首页>建造者模式/生成器模式
建造者模式/生成器模式
2022-08-03 15:53:00 【l_ethan】
定义
建造者模式是一种创建型设计模式,能够分步骤创建复杂对象。该模式允许使用相同的创建代码生题不同类型和形式的对象。
建造者模式建议将对象构造代码从产品类中抽取出来,并将其放在一个名为生成器的独立对象中。
结构

- 生成器(Builder)接口声明在所有类型生成器中通用的产品构造步骤。
- 具体生成器(Concrete Builders)提供构造过程的不同实现。具体生成器也可以构造不遵循通用接口的产品。
- 产品(Products)是最终生成的对象。由不同生成器构造的产品无需属于同一类层次结构或接口。
- 主管(Director)类定义调用构造步骤的顺序,这样你就可以创建和复用特定的产品配置。
- 客户端(Client)必须将某个生成器对象与主管类关联。一般情况下,你只需通过主管类构造函数的参数进行一次性关联即可。此后主管类就能使用生成器对象完成后续所有的构造任务。但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。在这种情况下,你在使用主管类生产产品时每次都可以使用不同的生成器。
优点
可以分步创建对象,暂缓创建步骤或递归运行创建步骤
生成不同形式的产品时,你可以复用相同的制造代码
单一职责原则。你可以将复杂构造代码从产品的业务逻辑中分离出来
缺点
由于该模式需要新增多个类,因此代码整体复杂度增加
案例
#include <iostream>
#include <string>
#include <mutex>
using namespace std;
class Car {
public:
Car(){}
void set_car_tire(string t) {
tire = t;
cout << "set tire:" << tire << endl;
}
void set_car_steering_wheel(string sw) {
steering_wheel = sw;
cout << "set steering wheel:" << steering_wheel << endl;
}
void set_car_engine(string e) {
engine = e;
cout << "set engine:" << engine << endl;
}
private:
string tire;//轮胎
string steering_wheel;//方向盘
string engine;//发动机
};
//抽象建造者
class CarBuilder {
public:
Car getCar() {
return car;
}
virtual void buildTire() = 0;
virtual void buildSteeringWheel() = 0;
virtual void buildEngine() = 0;
protected:
Car car;
};
//具体建造者 奔驰
class BenzBuilder :public CarBuilder {
public:
//具体实现方法
virtual void buildTire() {
car.set_car_tire("benz_tire");
}
virtual void buildSteeringWheel() {
car.set_car_steering_wheel("benz_steering_wheel");
}
virtual void buildEngine() {
car.set_car_engine("benz_engine");
}
};
//具体建造者 奔驰
class AudiBuilder :public CarBuilder {
public:
//具体实现方法
virtual void buildTire() {
car.set_car_tire("audi_tire");
}
virtual void buildSteeringWheel() {
car.set_car_steering_wheel("audi_steering_wheel");
}
virtual void buildEngine() {
car.set_car_engine("audi_engine");
}
};
//指挥者
class Director {
public:
Director() : builder(nullptr) {
}
void set_builder(CarBuilder* cb) {
builder = cb;
}
//组装汽车
Car constructcar() {
builder->buildTire();
builder->buildSteeringWheel();
builder->buildEngine();
return builder->getCar();
}
private:
CarBuilder* builder;
};
int main()
{
CarBuilder* builder;
Director* director = new Director();
Car car;
builder = new BenzBuilder();
director->set_builder(builder);
car = director->constructcar();
delete builder;
builder = new AudiBuilder();
director->set_builder(builder);
car = director->constructcar();
delete builder;
delete director;
return 0;
}边栏推荐
- 下午见!2022京东云数据库新品发布会
- AI也有健忘症?英国41岁教授专访:解决灾难性遗忘
- 请问下阿里云全托管flink能执行两条flink sql命令么?
- QT QT 】 【 to have developed a good program for packaging into a dynamic library
- 移动应用出海,你的“网络优化”拖后腿了吗?
- 2021年数据泄露成本报告解读
- 产品以及研发团队有使用专业的办公软件,如禅道、蓝湖等,他们应该如何使用 Tita 系统?
- Small Tools (4) integrated Seata1.5.2 distributed transactions
- CopyOnWriteArrayList详解
- 使用Make/CMake编译ARM裸机程序(基于HT32F52352 Cortex-M0+)
猜你喜欢

STM32的HAL和LL库区别和性能对比

一文看懂推荐系统:概要02:推荐系统的链路,从召回粗排,到精排,到重排,最终推荐展示给用户

Interpretation of the 2021 Cost of Data Breach Report

STM32 GPIO LED和蜂鸣器实现【第四天】

Neural networks, cool?

Awesome!Coroutines are finally here!Thread is about to be in the past

我在滴滴做开源

How to play deep paging with hundreds of millions of data?Compatible with MySQL + ES + MongoDB

如何将二维空间先验注入到ViT中? UMA&港理工&阿里提出SP-ViT,为视觉Transformer学习2D空间先验知识!...

Js array method is summarized
随机推荐
【Unity入门计划】基本概念(7)-Input Manager&Input类
Spark entry learning-2
Internship Road: Documenting Confusion in My First Internship Project
攻防世界----bug
1、实例开启无锁表结构变更以后,在任务编排中通过“单实例SQL”节点进行的结构变更,是优先采用无锁表
如何分析周活跃率?
语音识别新一轮竞争打响,自然对话会是下一个制高点吗?
Daily practice------There are 10 numbers that are required to be output from large to small by selection method
Three key expectations for the crypto market in August Price moves north?Still expected to be in turmoil
【Unity入门计划】制作RubyAdventure01-玩家的创建&移动
技术干货|如何将 Pulsar 数据快速且无缝接入 Apache Doris
window.open不显示favicon.icon
ECCV 2022 | Relational Query-Based Temporal Action Detection Methods
用户侧有什么办法可以自检hologres单表占用内存具体是元数据、计算、缓存的使用情况?
【深度学习】今日bug(8月2)
美国国防部更“青睐”光量子系统研究路线
袁小林:沃尔沃专注于出行的安全感,并且把它做到极致
【Unity入门计划】基本概念(8)-瓦片地图 TileMap 01
[QT] Qt project demo: data is displayed on the ui interface, double-click the mouse to display specific information in a pop-up window
5v充8.4v1A电流充电管理ic