设计模式复习-建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


#pragma once
#include "stdafx.h"
#include<list>
#include<string>
#include<iostream>
#include<windows.h>
using namespace std;

//设计模式-建造者模式 Builder

//Product类-产品类,由多个部件组成。
class Product {
private:
	list<string>mParts;
public:
	Product() {
		mParts.clear();
	}
	VOID Add(string strPart) {
		mParts.push_back(strPart);
	}
	VOID Show() {
		cout << "产品创建" << endl;
		for each(string index in mParts) {
			cout << index << endl;
		}
	}
};

//Builder类-抽象建造者
class Builder {
public:
	virtual VOID BuildPartA() = 0;
	virtual VOID BuildPartB() = 0;
	virtual Product* GetProduct() = 0;
};

//建造者1
class ConcreteBuilder1 :public Builder {
private:
	Product * mpProduct = NULL;
public:
	ConcreteBuilder1() {mpProduct = new Product();}
	~ConcreteBuilder1() {delete mpProduct;}

	VOID BuildPartA() {
		mpProduct->Add("部件A");
	}
	VOID BuildPartB() {
		mpProduct->Add("部件B");
	}
	Product* GetProduct() {
		return mpProduct;
	}
};

//建造者2
class ConcreteBuilder2 :public Builder {
private:
	Product * mpProduct = NULL;
public:
	ConcreteBuilder2() { mpProduct = new Product(); }
	~ConcreteBuilder2() { delete mpProduct; }

	VOID BuildPartA() {
		mpProduct->Add("部件X");
	}
	VOID BuildPartB() {
		mpProduct->Add("部件Y");
	}
	Product* GetProduct() {
		return mpProduct;
	}
};

//Director-指挥者类
class Director {
public:
	VOID Construct(Builder *pConcreteBuilder) {
		pConcreteBuilder->BuildPartA();
		pConcreteBuilder->BuildPartB();
	}
};


int main()
{
	Director *mDirector = new Director();
	ConcreteBuilder1 * pBuilder1 = new ConcreteBuilder1();
	ConcreteBuilder2 * pBuilder2 = new ConcreteBuilder2();
	
	mDirector->Construct(pBuilder1);
	mDirector->Construct(pBuilder2);
	Product *pProduct1 = pBuilder1->GetProduct();
	Product *pProduct2 = pBuilder2->GetProduct();

	pProduct1->Show();
	pProduct2->Show();

	delete mDirector;
	delete pBuilder1, delete pBuilder2;
	//delete pProduct1, delete pProduct2;

	getchar();
	return 0;
}

原文地址:https://www.cnblogs.com/csnd/p/12061917.html