C++11 设计模式6. 建造者模式,也叫做生成器模式

发布于:2024-04-30 ⋅ 阅读:(24) ⋅ 点赞:(0)

一 什么是建造者模式?

        建造者模式(也被成为⽣成器模式),是⼀种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,⽽建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义⼀个抽象的接⼝。具体的构建过程由实现了这些接⼝的具体建造者类来完成。同时有⼀个指导者类负责协调建造者的⼯作,按照⼀定的顺序或逻辑来执⾏构建步骤,最终⽣成产品。
        举个例⼦,假如我们要创建⼀个计算机对象,计算机由很多组件组成,例如 CPU、内存、硬盘、显卡等每个组件可能有不同的型号、配置和制造,这个时候计算机就可以被视为⼀个复杂对象,构建过程相对复杂,⽽我们使⽤建造者模式将计算机的构建过程封装在⼀个具体的建造者类中,⽽指导者类则负责指导构建的步骤和顺序。每个具体的建造者类可以负责构建不同型号或配置的计算机,客户端代码可以通过选择不同的建造者来创建不同类型的计算机,这样就可以根据需要构建不同表示的复杂对象,更加灵活。

假设我们要创建一个计算机对象,普通的写法如下:

// 004构建者模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

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

//cpu 
class CPU {
public:
	CPU(string cpuname) :_cpuname(cpuname) {
		cout << "CPU 构造方法被调用 _cpuname = " << _cpuname << endl;
	}
public:
	string _cpuname;

};

class Memory {
public:
	Memory(string memname) :_memname(memname) {
		cout << "Memory 构造方法被调用 _memname = " << memname << endl;
	}
public:
	string _memname;
};

class Harddisk {
public:
	Harddisk(string diskname) :_diskname(diskname) {
		cout << "Harddisk 构造方法被调用 diskname = " << diskname << endl;
	}
public:
	string _diskname;
};

class GraphicsCard {
public:
	GraphicsCard(string gcname) :_gcname(gcname) {
		cout << "GraphicsCard 构造方法被调用 _gcname = " << _gcname << endl;
	}
public:
	string _gcname;
};

//如果是普通的写法
//假如我们要创建⼀个计算机对象,计算机由很多组件组成,
//例如 CPU、内存、硬盘、显卡等。
//每个组件可能有不同的型号、配置和制造,
//这个时候计算机就可以被视为⼀个复杂对象
class Computer {
public:
	Computer(CPU *cpu, Memory *mem, Harddisk *hdisk, GraphicsCard *gc)
		:_cpu(cpu),_mem(mem),_hdisk(hdisk),_gc(gc) {
		cout << "Computer 构造方法被调用" << endl;
	}
	~Computer() {
		cout << "Computer 析构方法被调用" << endl;
	}
	void printfCom() {
		cout << "cpu = " << this->_cpu->_cpuname
			<< "   mem = " << this->_mem->_memname
			<< "   hdisk = " << this->_hdisk->_diskname
			<< "   gc = " << this->_gc->_gcname
			<<endl;
	}
protected:
	CPU *_cpu;
	Memory *_mem;
	Harddisk *_hdisk;
	GraphicsCard *_gc;
};



int main()
{
    std::cout << "Hello World!\n";
	CPU cpu("intelcpu");
	Memory mem("sanxingmem");
	Harddisk disk("xindisk");
	GraphicsCard gc("huaweixianka");
	Computer comA(&cpu,&mem,&disk,&gc);
	comA.printfCom();
	//这里有个问题,如果我们创建的cpmputer比较多,又有不同的型号,那么很容易写错。

	//创建者模型就是解决这个问题
}