建造者模式

选自《大话设计模式》

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

这样隐藏了产品是如何组装的,要给变一个产品的内部表示,只要再定义一个具体的建造者就可以。

建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分和它的装配方式时适用。

//product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_

#include <iostream>
#include <string>
#include <list>

using namespace std;

class product
{
	public:
		product() {}
		virtual ~product()
		{
			for(list<string *>::iterator iter = parts.begin(); iter != parts.end(); iter++)
			{
				delete *iter;
				*iter = NULL;
			}
		}
		
		void add(const string &part)
		{
			parts.push_back(new string(part));
		}
		
		void show()
		{
			for(list<string *>::iterator iter = parts.begin(); iter != parts.end(); iter++)
			{
				cout << *(*iter) << " ";
			}
			cout << endl;
		}
	private:
		list<string *> parts;
};

class builder
{
	public:
		builder() {}
		virtual ~builder() {}
		
		virtual void buildProductA() = 0;
		virtual void buildProductB() = 0;
		virtual product *getResult() = 0;
};

class concreteBuilder1: public builder
{
	public:
		concreteBuilder1():pro(new product()) {}
		~concreteBuilder1() 
		{
			delete pro;
			pro = NULL; 
		}
		
		void buildProductA()
		{
			pro->add("部件A"); 
		}
		
		void buildProductB()
		{
			pro->add("部件B"); 
		}
		
		product *getResult()
		{
			return pro; 
		} 
	private:
		product *pro;
};

class concreteBuilder2: public builder
{
	public:
		concreteBuilder2():pro(new product()) {}
		~concreteBuilder2() 
		{
			delete pro;
			pro = NULL; 
		}
		
		void buildProductA()
		{
			pro->add("部件X"); 
		}
		
		void buildProductB()
		{
			pro->add("部件Y"); 
		}
		
		product *getResult()
		{
			return pro; 
		} 
	private:
		product *pro;
};

class director
{
	public:
		void construct(builder *bu)
		{
			bu->buildProductA();
			bu->buildProductB();  
		} 
}; 
#endif

#include <iostream>
#include "product.h"

using namespace std;

int main()
{
	
	director dir;
	concreteBuilder1 *builder1 = new concreteBuilder1(); 
	concreteBuilder2 *builder2 = new concreteBuilder2();
	product *pro = NULL;
	dir.construct(builder1);
	pro = builder1->getResult();
	pro->show();
	dir.construct(builder2);
	pro = builder2->getResult();
	pro->show(); 
	delete builder1;
	builder1 = NULL; 
	delete builder2;
	builder2 = NULL; 
	
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值