创建者模式

      建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示:

《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构

 对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。

代码示例:

// 建造者模式2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class Men
{
public:
	void SetBody(int param)
	{
		m_nBody = param;
	}
	void SetEye(int param)
	{
		m_nEye = param;
	}
	void SetFoot(int param)
	{
		m_nFoot = param;
	}

	void show()
	{
		printf("body:%d\neye:%d\nfoot:%d\n",m_nBody,m_nEye,m_nFoot);
	}
private:
	int m_nBody;
	int m_nEye;
	int m_nFoot;
};

class  BaseBuilder
{
public:
	virtual void CreateMen() = 0;
	virtual void BuildBody(int param) = 0;
	virtual void BuildEye(int param) = 0;
	virtual void BuildFoot(int param) = 0;
	virtual Men* GetMen() = 0;

};

class FatBuilder : public BaseBuilder
{
public:
	void CreateMen() 
	{
		printf("create a fatter!!\n");
		m_men = new Men();
	}
	void BuildBody(int param)
	{
		m_men->SetBody(param);
	}
	void BuildEye(int param)
	{
		m_men->SetEye(param);
	}
	void BuildFoot(int param)
	{
		m_men->SetFoot(param);
	}
	Men* GetMen() 
	{
		return m_men;
	}
protected:
private:
	Men * m_men;
};


class ThinBuilder : public BaseBuilder
{
public:
	void CreateMen() 
	{
		printf("create a thiner!!\n");
		m_men = new Men();
	}
	void BuildBody(int param)
	{
		m_men->SetBody(param);
	}
	void BuildEye(int param)
	{
		m_men->SetEye(param);
	}
	void BuildFoot(int param)
	{
		m_men->SetFoot(param);
	}
	Men* GetMen() 
	{
		return m_men;
	}
protected:
private:
	Men * m_men;
};

class Director
{
public:
	Director(BaseBuilder* base)
	{
		m_baseBuilder = base;
	}
	void BuilderMen()
	{
		m_baseBuilder->CreateMen();
		m_baseBuilder->BuildBody(501);
		m_baseBuilder->BuildEye(502);
		m_baseBuilder->BuildFoot(503);
	}

public:
	BaseBuilder* m_baseBuilder;
};

int main(int argc, char* argv[])
{
// 	Men* men2 = new Men();
// 	men2->SetBody(100);
// 	men2->SetEye(200);
// 	men2->SetFoot(300);
// 	men2->show();
	Director* director = NULL;
	BaseBuilder* base =  NULL;
	Men* men  = NULL;
	base = new FatBuilder();
	director = new Director(base);
	director->BuilderMen();
	men = base->GetMen();
	men->show();
	printf("Hello World!\n");

	base = new ThinBuilder();
	director = new Director(base);
	director->BuilderMen();
	men = base->GetMen();
	men->show();

	printf("Hello World!\n");
	return 0;
}
结果:

create a fatter!!
body:501
eye:502
foot:503
Hello World!
create a thiner!!
body:501
eye:502
foot:503
Hello World!
Press any key to continue

猜你喜欢

转载自blog.csdn.net/djb100316878/article/details/49684445