05_23 种设计模式之《建造者模式》

文章目录

一、建造者模式基础知识

建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种优雅的方式来创建复杂对象,同时隐藏其构建过程。这种模式允许你通过指定复杂对象的类型和内容来构建它们,然后分步骤创建复杂对象的各个部分。

建造者模式的结构

建造者模式通常包含以下角色:

产品(Product):需要构建的复杂对象。

建造者(Builder):提供一个接口,用于创建和表示产品的不同部分。

具体建造者(ConcreteBuilder):实现建造者接口,定义产品对象的各个部分的构建和表示。

指挥者(Director):负责安排已有模块的建造过程,不涉及具体的构建细节。

客户端(Client):使用指挥者和建造者来创建复杂对象。

建造者模式的应用场景

复制代码
创建复杂对象:当对象的构建过程复杂或者对象本身包含多个成员变量时。
相同的方法,不同的执行顺序:不同的执行顺序可能会导致不同的结果。
分步骤构建:需要分步骤构建对象,每一步都可以独立进行。
隔离复杂对象的构建和表示:客户端不需要知道对象是如何构建的,只需要知道如何使用它。
cpp 复制代码
#pragma once

#include <iostream>
#include <string.h>

using namespace std;

class Phone // 电话类
{
public:
	Phone();
	~Phone();

	void setCamera(string camera);
	void setBattery(string battery);
	void setScreen(string screen);

	void PrintCamera();
	void PrintBattery();
	void PrintScreen();

private:
	string strCamera;	// 摄像头
	string strBattery;	// 电池
	string strScreen;	// 屏幕
};

//----------------------

#include "Phone.h"

Phone::Phone(){
	cout << "调用Phone类的构造函数." << endl;
}

Phone::~Phone() {
	cout << "调用Phone类的析构函数." << endl;
}



void Phone::setCamera(string camera) {
	strCamera = camera;
}

void Phone::setBattery(string battery) {
	strBattery = battery;
}

void Phone::setScreen(string screen)
{
	strScreen = screen;
}



void Phone::PrintCamera() {
	cout << "Camera-->" << strCamera.c_str() << endl;
}

void Phone::PrintBattery() {
	cout << "Battery-->" << strBattery.c_str() << endl;
}

void Phone::PrintScreen() {
	cout << "Screen-->" << strScreen.c_str() << endl;
}
cpp 复制代码
#pragma once

#include "Phone.h"

class Fbuilder // 基类
{
public:
	Fbuilder();
	~Fbuilder();

protected:
	Phone* phone; // 电话对象

public:
	virtual void buildCamera() = 0;
	virtual void buildBattery() = 0;
	virtual void buildScreen() = 0;

	virtual Phone* GetPhone();

};

class IphoneBuilder :public Fbuilder { // 苹果派生类
public:
	IphoneBuilder();
	void buildCamera();
	void buildBattery();
	void buildScreen();
};

class HuaweiBuilder :public Fbuilder { // 华为派生类
public:
	HuaweiBuilder();
	void buildCamera();
	void buildBattery();
	void buildScreen();
};


//------------------------------
#include "Fbuilder.h"

Fbuilder::Fbuilder(){

}

Fbuilder::~Fbuilder() {

}

Phone* Fbuilder::GetPhone()
{
	return phone;
}




IphoneBuilder::IphoneBuilder() {
	phone = new Phone;
}
void IphoneBuilder::buildCamera() {
	phone->setCamera("Iphone Camera Created.");
}
void IphoneBuilder::buildBattery() {
	phone->setBattery("Iphone Battery Created.");
}
void IphoneBuilder::buildScreen() {
	phone->setScreen("Iphone Screen Created.");
}



HuaweiBuilder::HuaweiBuilder() {
	phone = new Phone;
}
void HuaweiBuilder::buildCamera() {
	phone->setCamera("Huawei Camera Created.");
}
void HuaweiBuilder::buildBattery() {
	phone->setBattery("Huawei Battery Created.");
}
void HuaweiBuilder::buildScreen() {
	phone->setScreen("Huawei Screen Created.");
}
cpp 复制代码
#pragma once

#include "Fbuilder.h"

class Director {
public:
	Director();
	Director(Fbuilder* builder);
	~Director();

	void CreateFunc(Fbuilder* builder);
	void CreateFunc();

private:
	Fbuilder *dbuilder;
};

//---------------------------

#include "Director.h"

Director::Director() {

}

// 另一种初始化:Director::Director(Fbuilder* builder):dbuilder(builder)
Director::Director(Fbuilder* builder) {
	dbuilder = builder;
}

Director::~Director() {

}

void Director::CreateFunc(Fbuilder* builder)
{
	builder->buildCamera();
	builder->buildBattery();
	builder->buildScreen();
}

void Director::CreateFunc()
{
	dbuilder->buildCamera();
	dbuilder->buildBattery();
	dbuilder->buildScreen();
}
cpp 复制代码
#include <iostream>
using namespace std;

#include "Phone.h"
#include "Director.h"
#include "Fbuilder.h"

int main()
{
    Fbuilder* huawei = new HuaweiBuilder;
    Fbuilder* iphone = new IphoneBuilder;
    Director* director = new Director;

    director->CreateFunc(huawei);
    director->CreateFunc(iphone);

    Phone* huaweiphone = huawei->GetPhone();
    Phone* iphonephone = iphone->GetPhone();

    huaweiphone->PrintCamera();
    huaweiphone->PrintScreen();
    huaweiphone->PrintBattery();

    cout << endl;

    iphonephone->PrintCamera();
    iphonephone->PrintScreen();
    iphonephone->PrintBattery();
    
    return 0;
}
相关推荐
wljy14 小时前
二、进制状态转换
linux·运维·服务器·c语言·c++
云泽8084 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
繁华落尽,倾城殇?5 小时前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
代码村新手5 小时前
C++-二叉搜索树
开发语言·c++
智者知已应修善业6 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业6 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
Doris_20238 小时前
代码格式化 使用oxfmt
设计模式·架构·前端框架
Doris_20238 小时前
说一说ESLint+Prettier生效的原理
前端·设计模式·架构
Pomelooooo10 小时前
把 git commit 这件事,彻底交给 AI ——一个工程化 /git-commit 命令的设计与落地
设计模式
玖釉-10 小时前
二叉树展开为链表:从先序遍历到原地指针重排
c++·windows·算法·leetcode·链表