重温设计模式--建造者模式

news/2024/12/24 9:14:10 标签: 设计模式, 建造者模式, java

文章目录

  • 建造者模式(Builder Pattern)概述
  • 建造者模式UML图
  • 作用:
  • 建造者模式的结构
    • 产品(Product):
    • 抽象建造者(Builder):
    • 具体建造者(Concrete Builder):
    • 指挥者(Director):
  • C++ 代码示例1
  • C++示例代码2

建造者模式(Builder Pattern)概述

定义:
建造者模式是一种创建型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也就是说,它把对象的创建逻辑和表示逻辑分离开来,让代码结构更加清晰,便于维护和扩展。

建造者模式UML图

在这里插入图片描述

作用:

便于创建复杂对象:对于那些具有多个属性、构造过程比较复杂的对象,使用建造者模式可以分步来构建对象,使创建过程更有条理。例如,创建一个包含多个部件的电脑对象,要配置 CPU、内存、硬盘等多种组件,通过建造者模式能清晰地完成配置过程。
提高代码的可维护性和可读性:把对象构建的各个步骤封装在不同的方法中,相比于在构造函数中罗列大量参数或者在一个方法里写复杂的初始化逻辑,代码结构更加清晰,后续阅读和维护代码时更容易理解对象的构建流程。
实现不同的构建配置:可以通过不同的建造者实现来创建对象的不同配置版本,比如对于一款游戏角色,可以创建不同属性配置的角色实例,满足不同场景需求。

建造者模式的结构

产品(Product):

这是最终要创建的复杂对象,它通常包含多个部件或者属性,比如上述提到的电脑对象,其内部有 CPU、内存、硬盘等不同的成员变量来构成完整的电脑实体。

抽象建造者(Builder):

它定义了创建产品各个部件的抽象方法,以及返回最终产品对象的抽象方法。比如对于电脑的抽象建造者,会有抽象的配置 CPU、配置内存等方法,还有获取构建好的电脑的抽象方法。

具体建造者(Concrete Builder):

实现了抽象建造者中定义的抽象方法,具体地来构建产品的各个部件,按照特定的逻辑和配置完成产品的组装,每个具体建造者可以创建出具有不同配置特点的产品。

指挥者(Director):

它负责指挥建造者进行对象的构建,通过调用建造者的相关方法来按顺序完成产品的创建过程,不过它并不关心具体的构建细节,只是协调构建步骤。

C++ 代码示例1

以下以创建一个简单的电脑对象为例来展示建造者模式的代码实现:

#include<iostream>
#include<string>

// 产品类:电脑
class Computer
{
private:
	std::string cpu;
	int memory;
	int hardDisk;
public:
	void setCpu(const std::string& cpu)
	{
		this->cpu = cpu;
	}
	void setMemory(int memory)
	{
		this->memory = memory;
	}
	void setHardDisk(int hardDisk)
	{
		this->hardDisk = hardDisk;
	}

	void showInfo()
	{
		std::cout << "CPU: " << cpu << std::endl;
		std::cout << "Memory: " << memory << "GB" << std::endl;
		std::cout << "Hard Disk: " << hardDisk << "GB" << std::endl;
	}
};

// 抽象建造者类
class ComputerBuilder
{
public:
	virtual void buildCpu() = 0;
	virtual void buildMemory() = 0;
	virtual void buildHardDisk() = 0;
	virtual Computer* getComputer() = 0;
};

// 具体建造者类,创建高配电脑
class HighEndComputerBuilder :public ComputerBuilder 
{
private:
	Computer* computer;
public:
	HighEndComputerBuilder() 
	{
		computer = new Computer();
	}
	void buildCpu() override
	{
		computer->setCpu("Intel Core i9");
	}
	void buildMemory() override
	{
		computer->setMemory(32);
	}
	void buildHardDisk() override
	{
		computer->setHardDisk(1024);
	}
	Computer* getComputer() override
	{
		return computer;
	}
};

// 具体建造者类,创建低配电脑
class LowEndComputerBuilder :	public ComputerBuilder
{
private:
	Computer* computer;
public:
	LowEndComputerBuilder()
	{
		computer = new Computer();
	}
	void buildCpu() override 
	{
		computer->setCpu("Intel Core i3");
	}
	void buildMemory() override 
	{
		computer->setMemory(8);
	}
	void buildHardDisk() override
	{
		computer->setHardDisk(256);
	}
	Computer* getComputer() override
	{
		return computer;
	}
};

// 指挥者类
class Director
{
private:
	ComputerBuilder* builder;
public:
	void setBuilder(ComputerBuilder* builder) 
	{
		this->builder = builder;
	}
	Computer* construct()
	{
		builder->buildCpu();
		builder->buildMemory();
		builder->buildHardDisk();
		return builder->getComputer();
	}
};

int main()
{
	Director director;

	// 创建高配电脑
	HighEndComputerBuilder highEndBuilder;
	director.setBuilder(&highEndBuilder);
	Computer* highEndComputer = director.construct();
	highEndComputer->showInfo();

	// 创建低配电脑
	LowEndComputerBuilder lowEndBuilder;
	director.setBuilder(&lowEndBuilder);
	Computer* lowEndComputer = director.construct();
	lowEndComputer->showInfo();

	delete highEndComputer;
	delete lowEndComputer;

	return 0;
}

在上述代码中:
Computer类就是产品类,代表要构建的电脑对象,有设置各部件属性和展示自身信息的方法。
ComputerBuilder是抽象建造者,定义了构建电脑各部件及获取电脑对象的抽象方法。
HighEndComputerBuilder和LowEndComputerBuilder是具体建造者,分别按照高配和低配的配置来构建电脑对象。
Director类作为指挥者,通过调用建造者的方法来协调完成电脑对象的构建过程,最终客户端代码(main函数中)可以方便地通过指挥者和不同的建造者配合,创建出不同配置的电脑对象,整个创建过程条理清晰,易于扩展和维护。

C++示例代码2

#include<iostream>
#include<list>
#include<string>
using namespace std;

class product
{
	list<string>ls;
public:
	void add(string m_str)
	{
		ls.push_back(m_str);
	}
	void show()
	{
		list<string>::iterator itr = ls.begin();
		for(;itr!=ls.end();++itr)
		{
			cout<<*itr<<endl;
		}
	}
};
class builder
{
public:
	virtual void head(){};
	virtual void body(){};
	virtual void leg(){};
	virtual void hand(){};
	virtual product getresult(){product s;return s;};
};

class  conbuild1:public builder
{
private:
	product *m_product;
public:
	conbuild1()
	{
		m_product = new product();
	}
	void head()
	{
		m_product->add("1的头");
	}
	void body()
	{
		m_product->add("1的身体");
	}
	void leg()
	{
		m_product->add("1的腿");
	}
	void hand()
	{
		m_product->add("1的手");
	}
	product getresult()
	{
		return *m_product;
	}
};

class  conbuild2:public builder
{
private:
	product *m_product;
public:
	conbuild2()
	{
		m_product = new product();
	}
	void head()
	{
		m_product->add("2的头");
	}
	void body()
	{
		m_product->add("2的身体");
	}
	void leg()
	{
		m_product->add("2的腿");
	}
	void hand()
	{
		m_product->add("2的手");
	}
	product getresult()
	{
		return *m_product;
	}
};

class director
{
public:
	void createpeople(builder *s)
	{
		s->body();
		s->hand();
		s->leg();
		s->head();
	}
};

int main()
{
	director s;
	builder *p1 = new conbuild1;
	builder*p2 = new conbuild2;
	s.createpeople(p1);
	product s1 = p1->getresult();
	s1.show();
	cout<<"---------------"<<endl;
	s.createpeople(p2);
	product s2 = p2->getresult();
	s2.show();
}


http://www.niftyadmin.cn/n/5797621.html

相关文章

图像处理中的图像配准方法

目录 图像处理中的图像配准是什么&#xff1f; 图像配准中使用的变换模型类型 1.仿射变换 2. 射影变换&#xff08;单应性&#xff09; 3.非刚性变换&#xff1a; 图像配准方法的类型 基于特征的方法 1. SIFT (Scale-Invariant Feature Transform) 2. SURF (Speeded-U…

UE5材质系统之PBR材质

打开UE默认材质球后都会显示PBR材质节点 PBR材质是工业流程经常使用的材质工作流 Base Color &#xff08;基础颜色&#xff09;&#xff1a;显示基础颜色信息&#xff0c;不包括任何照明或阴影&#xff0c;基本颜色纹理看起来非常平坦 Metallicity &#xff08;金属度&#…

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件&#xff1a; /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…

CentOS7系统下部署tomcat,浏览器访问localhost:8080/

我这里以本地的VMware虚拟机创建的CentOS为例,来讲解部署tomcat的步骤,阿里云的服务器ECS部署只需设置下安全组规则即可,Centos内一样。 首先启动VM,输入密码进入centos,用xshell连接 2. 在家目录输入 cd /usr/local 进入local目录, 输入 mkdir java &#xff0c;创建java目录…

《OpenCV计算机视觉》--介绍及基础操作

文章目录 《OpenCV计算机视觉》--介绍及基础操作一.OpenCV介绍二.下载OpenCV三.基础操作1.调用OpenCV2.读取图片信息3.读取图片的灰度图4.视频文件读取5.对图片进行切片6.提取RGB颜色通道7.合并颜色通道8.图片修改图片打码图片组合 9.cv2.resize10.图形运算图像加法运算cv2.add…

2、光同步数字传送网的特点

同步复用 光同步数字传送网&#xff08;SDH&#xff09;采用同步复用方式。它将多个低速信号复用成高速信号&#xff0c;与准同步数字体系&#xff08;PDH&#xff09;的异步复用不同。在 SDH 中&#xff0c;各支路信号与复用后的高速信号是同步的&#xff0c;这种同步复用的方…

【Pycharm相关设置】新版Pycharm关闭主菜单,取消自动隐藏工具栏

【Pycharm相关设置】新版Pycharm关闭主菜单&#xff0c;取消自动隐藏工具栏 Pycharm主菜单关闭主菜单 Pycharm主菜单 新版pycharm多了主菜单&#xff0c;会自动隐藏工具栏&#xff0c;强迫症犯了 找了很久关闭的地方 关闭主菜单 设置–>外观–》取消勾选“合并主菜单和窗口…

图像处理基础 | 格式转换.rgb转.jpg 灰度图 python

一般情况下 .rgb 格式的存储顺序&#xff1a; 颜色顺序&#xff1a; 一般情况下&#xff0c;.rgb 文件存储的是原始的 RGB 数据&#xff08;而不是 BGR 数据&#xff09;。即每个像素是由 R&#xff08;红色&#xff09;、G&#xff08;绿色&#xff09;、B&#xff08;蓝色&…