设计模式之建造者模型

13 篇文章 0 订阅
10 篇文章 1 订阅

 首先看一个比较通用的模型例子:

builder.h

//设计模式之builder模式
/*
作用:将一个复杂对象的构建与它的表示分离,使同样的构建过程创建不同的表示
*/
//虚拟基类,所有builder的基类,提供不同部分的构建接口
class builder
{
public:
	builder(){};
	virtual ~builder(){};

	//提供构建接口
	virtual void builderA() = 0;
	virtual void builderB() = 0;
};

//使用builder构建产品,构建产品的过程都一致,但是不同的builder会有不同的表现
//这个不同的实现通过不同的builder派生类来实现,存有一个builder的指针,多态调用
class director
{//
public:
	director(builder *pbuilder);
	virtual ~director();

	void construct();
private:
	builder *pBuilder;
};

class concretebuilder1:public builder
{
public:
	concretebuilder1(){}
	virtual ~concretebuilder1(){}
	virtual void builderA();
	virtual void builderB();
};
class concretebuilder2:public builder
{
public:
	concretebuilder2(){}
	virtual ~concretebuilder2(){}

	virtual void builderA();
	virtual void builderB();
};

builder.cpp

#include "builder.h"
#include <stdio.h>

void concretebuilder1::builderA()
{
	printf("builderA by concretebuilder1\n");
}

void concretebuilder1::builderB()
{
	printf("builderB by concretebuilder1\n");
}

void concretebuilder2::builderA()
{
	printf("builderA by concretebuilder2\n");
}

void concretebuilder2::builderB()
{
	printf("builderB by concretebuilder2\n");
}

director::director(builder *pbuilder)
{
	this->pBuilder = pbuilder;
}
director::~director()
{
	delete pBuilder;
	pBuilder = NULL;
}

void director::construct()
{
	pBuilder->builderA();
	pBuilder->builderB();
}


void main()
{
	builder *pbuilder1 = new concretebuilder1;
	director *pdirector = new director(pbuilder1);
	pdirector->construct();

	builder *pbuilder2 = new concretebuilder2;
	director *pdirector2 = new director(pbuilder2);
	pdirector2->construct();

	delete pdirector;
	delete pdirector2;

}


使用一个具体的例子来理解builder模型:

carbuilder.h

//
/*
客户模型:
carmodel:汽车模型
benmodel:奔驰汽车
bmwmodel:宝马汽车
carbuilder:建造者接口
benbuilder:奔驰建造者
bmwbuilder:宝马建造者
director:导演
*/

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

//首先虚拟出一个汽车模型
class carmodel
{
public:
	carmodel();
	virtual ~carmodel();
	void Run();
	void SetSequence(vector<string> *pSeq);

protected:
	//定义出一系列操作
	virtual void Start() = 0;
	virtual void Stop() = 0;
	virtual void Alarm() = 0;
	virtual void EngineBoom() = 0;
private:
	vector<string> *m_pSequence;
};
//根据汽车模型构建奔驰汽车
class benmodel:public carmodel
{
public:
	benmodel();
	~benmodel();
protected:
	void Start();
	void Stop();
	void Alarm();
	void EngineBoom();

};
//根据汽车模型构建宝马汽车
class bmwmodel:public carmodel
{
public:
	bmwmodel();
	~bmwmodel();
protected:
	void Start();
	void Stop();
	void Alarm();
	void EngineBoom();

};
//虚拟出一个汽车的建造者模型
class carbuilder
{
public:
	carbuilder()
	{

	}
	virtual ~carbuilder()
	{

	}
	virtual void SetSequence(vector<string> *pSeq) = 0;
	virtual carmodel* GetCarModel() = 0;
};

class benbuilder:public carbuilder
{
public:
	benbuilder();
	~benbuilder();
	void SetSequence(vector<string> *pSeq);
	carmodel* GetCarModel();
private:
	carmodel *pBen;
};
class bmwbuilder:public carbuilder
{
public:
	bmwbuilder();
	~bmwbuilder();
	void SetSequence(vector<string> *pSeq);
	carmodel* GetCarModel();
private:
	carmodel *pBmw;
};


class director
{
public:
	director();
	~director();
	benmodel* GetABenModel();
	benmodel* GetBBenModel();
	bmwmodel* GetCBmwModel();
	bmwmodel* GetDBmwModel();
private:
	vector<string> *pSequence;
	benbuilder *pBen;
	bmwbuilder *pBmw;
};

carbuilder.cpp

#include"builder.h"
carmodel::carmodel()
{

}
carmodel::~carmodel()
{

}
void carmodel::SetSequence(vector<string> *pSeq)
{
	m_pSequence = pSeq;
}
void carmodel::Run()
{
	vector<string>::const_iterator it = m_pSequence->begin();
	for(;it != m_pSequence->end();++it )
	{
		string actionName = *it;
		if(actionName.compare("start") == 0)
		{
			Start();
		}
		else if(actionName.compare("stop") == 0)
		{
			Stop();
		}
		else if(actionName.compare("alarm") == 0)
		{
			Alarm();
		}
		else if(actionName.compare("engine boom") == 0)
		{
			EngineBoom();
		}
	}
}

benmodel::benmodel()
{

}
benmodel::~benmodel()
{

}
void benmodel::Start()
{
	cout<<"ben start..."<<endl;
}
void benmodel::Stop()
{
	cout<<"ben stop..."<<endl;
}
void benmodel::Alarm()
{
	cout<<"ben alarm..."<<endl;
}
void benmodel::EngineBoom()
{
	cout<<"ben engineboom..."<<endl;
}

bmwmodel::bmwmodel()
{

}
bmwmodel::~bmwmodel()
{

}
void bmwmodel::Start()
{
	cout<<"bmw start..."<<endl;
}
void bmwmodel::Stop()
{
	cout<<"bmw stop..."<<endl;
}
void bmwmodel::Alarm()
{
	cout<<"bmw alarm..."<<endl;
}
void bmwmodel::EngineBoom()
{
	cout<<"bmw engineboom..."<<endl;
}

benbuilder::benbuilder()
{
	//在构造函数中创建奔驰汽车的模型
	pBen = new benmodel();
}
benbuilder::~benbuilder()
{

}
carmodel* benbuilder::GetCarModel()
{
	return pBen;
}
void benbuilder::SetSequence(vector<string> *pSeq)
{
	pBen->SetSequence(pSeq);
}

bmwbuilder::bmwbuilder()
{
	//在构造函数中创建宝马汽车的模型
	pBmw = new bmwmodel();
}
bmwbuilder::~bmwbuilder()
{

}
carmodel* bmwbuilder::GetCarModel()
{
	return pBmw;
}
void bmwbuilder::SetSequence(vector<string> *pSeq)
{
	pBmw->SetSequence(pSeq);
}

director::director()
{
	pBen = new benbuilder();
	pBmw = new bmwbuilder();
	pSequence = new vector<string>();
}
director::~director()
{
	delete pBen;
	delete pBmw;
	delete pSequence;
}
benmodel * director::GetABenModel()
{
	pSequence->clear();
	pSequence->push_back("start");
	pSequence->push_back("stop");
	pBen->SetSequence(pSequence);
	return dynamic_cast<benmodel*>(pBen->GetCarModel());
}
benmodel * director::GetBBenModel()
{
	pSequence->clear();
	pSequence->push_back("start");
	pSequence->push_back("Alarm");
	pSequence->push_back("Stop");
	pBen->SetSequence(pSequence);
	return dynamic_cast<benmodel*>(pBen->GetCarModel());
}
bmwmodel *director::GetCBmwModel()
{
	pSequence->clear();
	pSequence->push_back("start");
	pSequence->push_back("stop");
	pBmw->SetSequence(pSequence);
	return dynamic_cast<bmwmodel*>(pBmw->GetCarModel());
}

bmwmodel *director::GetDBmwModel()
{
	pSequence->clear();
	pSequence->push_back("start");
	pSequence->push_back("Engineboom");
	pBmw->SetSequence(pSequence);
	return dynamic_cast<bmwmodel*>(pBmw->GetCarModel());
}
int main()
{
	director *pdir = new director;

	benmodel *pben = pdir->GetABenModel();
	pben->Run();

	bmwmodel *pbmw = pdir->GetCBmwModel();
	pbmw->Run();
	delete pdir;
	return 0;
}


非常推荐一个例子:http://blog.csdn.net/wuzhekai1985/article/details/6667467
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建造者模式(Builder Pattern)是一种创建型设计模式,其目的是将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。在该模式中,建造者类负责创建一个复杂对象的各个部分,并将这些部分组装起来形成完整的对象。 在PHP中,我们可以通过以下代码实现建造者模式: 1. 创建建造者接口Builder,用于定义构造复杂对象的方法。 ``` interface Builder { public function buildPartA(); public function buildPartB(); public function buildPartC(); public function getResult(); } ``` 2. 创建具体建造者类ConcreteBuilder,实现Builder接口中定义的方法,用于构造一个具体对象。 ``` class ConcreteBuilder implements Builder { private $product; public function __construct() { $this->product = new Product(); } public function buildPartA() { $this->product->setPartA('Part A'); } public function buildPartB() { $this->product->setPartB('Part B'); } public function buildPartC() { $this->product->setPartC('Part C'); } public function getResult() { return $this->product; } } ``` 3. 创建产品类Product,用于表示复杂对象。 ``` class Product { private $partA; private $partB; private $partC; public function setPartA($partA) { $this->partA = $partA; } public function setPartB($partB) { $this->partB = $partB; } public function setPartC($partC) { $this->partC = $partC; } public function getParts() { return [$this->partA, $this->partB, $this->partC]; } } ``` 4. 创建指挥者类Director,用于控制建造过程。 ``` class Director { private $builder; public function setBuilder(Builder $builder) { $this->builder = $builder; } public function construct() { $this->builder->buildPartA(); $this->builder->buildPartB(); $this->builder->buildPartC(); } } ``` 5. 在客户端代码中,使用指挥者类Director来构造一个具体对象。 ``` $builder = new ConcreteBuilder(); $director = new Director(); $director->setBuilder($builder); $director->construct(); $product = $builder->getResult(); print_r($product->getParts()); ``` 输出结果: ``` Array ( [0] => Part A [1] => Part B [2] => Part C ) ``` 以上就是基于PHP实现建造者模式模型的示例代码。通过该模式,我们可以将一个复杂对象的构造过程与表示分离,从而使得代码更加灵活和易于维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值