设计模式之建造者模式(C++实现)

这两天工作不忙,抽空学习了设计模式中的建造者模式,感觉《设计模式---可复用面向对象软件的基础》这本书不适合我看,有些东西写的太杂,反正我是没心情一点点的看,所以又买了一本《大话设计模式》,对于设计模式的学习今天看了一篇文章说:学习设计模式最主要的是记住模式的应用场景和UML图,深有感触,设计模式的思想靠死记硬背确实不是容易记住,好了,发发牢骚,言归正传,下面的对今天设计模式的总结以及对设计模式理解的代码实现。  

建造者模式:将一个复杂的对象的构建和表示区分开来。最主要的特征了对象的创建必须按照一定的流程,指挥者使用建造者按照这个流程创建对象,该流程不可变,建造者在建造具体对象的细节是可变的,也就是对象的表示。




ifndef BUILDER_H_
#define BUILDER_H_
#include "product.h"
class builder
{

	//按照统一步骤构建产品,但是产品的构建过程对客户不可见,这样就可以创建不一样的产品,将对象的构建和它的表示实现分离的目的
public:
	virtual void buildPartA(){};
	virtual void buildPartB(){};
	virtual void buildPartC(){};

public:
	Product *product;
};

class ConcreteBuilderFat : public builder
{
public:
	ConcreteBuilderFat();
	~ConcreteBuilderFat();
	void buildPartA();
	void buildPartB();
	void buildPartC();
	Product * GetResult();
};

class ConcreteBuilderThin : public builder
{
public:
	ConcreteBuilderThin();
	~ConcreteBuilderThin();
	void buildPartA();
	void buildPartB();
	void buildPartC();
	Product * GetResult();
};
#endif

builder.cpp

#include "builder.h"

void ConcreteBuilderFat::buildPartA()
{
	product->SetPartA("胖子头");
}
void ConcreteBuilderFat::buildPartB()
{
	product->SetPartB("胖子身子");
}

void ConcreteBuilderFat::buildPartC()
{
	product->SetPartC("胖子脚");
}

Product* ConcreteBuilderFat::GetResult()
{
	return this->product;
}

ConcreteBuilderFat::ConcreteBuilderFat()
{
	product = new Product();
}

ConcreteBuilderFat::~ConcreteBuilderFat()
{
	delete product;
	product = NULL;
}


void ConcreteBuilderThin::buildPartA()
{
	product->SetPartA("瘦子头");
}
void ConcreteBuilderThin::buildPartB()
{
	product->SetPartB("瘦子身子");
}

void ConcreteBuilderThin::buildPartC()
{
	product->SetPartC("瘦子脚");
}

Product* ConcreteBuilderThin::GetResult()
{
	return this->product;
}

ConcreteBuilderThin::ConcreteBuilderThin()
{
	product = new Product();
}

ConcreteBuilderThin::~ConcreteBuilderThin()
{
	delete product;
	product = NULL;
}

Product.h

#ifndef PRODUCT_H_
#define PRODUCT_H_
#include <iostream>

class Product
{

public:
	void SetPartA(std::string str){ partA = str; }
	void SetPartB(std::string str){ partB = str; };
	void SetPartC(std::string str){ partC = str; }
	void ShowPartA(){ std::cout << partA.c_str() << std::endl; }
	void ShowPartB(){ std::cout << partB.c_str() << std::endl; }
	void ShowPartC(){ std::cout << partC.c_str() << std::endl; }

private:
	std::string partA,partB,partC;
};

#endif

Director.h

#ifndef DIRECTOR_H_
#define DIRECTOR_H_
#include"builder.h"
class Director
{
public:
	void Construct();
	void SetBuilder(builder *);
private:
	builder* m_builder;
};

#endif

Director.cpp

#include "Director.h"

void Director::Construct()
{
	m_builder->buildPartA();
	m_builder->buildPartB();
	m_builder->buildPartC();
}

void Director::SetBuilder(builder * builder)
{
	m_builder = builder;
}

main.cpp

#include "Director.h"

int main()
{
	ConcreteBuilderFat *mBuilderfat = new ConcreteBuilderFat();
	Director dir;
	dir.SetBuilder(mBuilderfat);
	dir.Construct();
	Product *fat = mBuilderfat->GetResult();
	fat->ShowPartA();
	fat->ShowPartB();
	fat->ShowPartC();


	ConcreteBuilderThin * mbuilderThin = new ConcreteBuilderThin();
	dir.SetBuilder(mbuilderThin);
	dir.Construct();
	Product* thin = mbuilderThin->GetResult();
	thin->ShowPartA();
	thin->ShowPartB();
	thin->ShowPartC();
	delete mBuilderfat;
	delete mbuilderThin;
	//调用指挥者同样的构建过程Construct,可以创建不一样的对象,这就是讲对象的构建和表示分开,对象总是按照统一的步骤构建的
	return 0;
}









1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值