建造者模式

建造者模式(Builder),将一个一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的对象。
举例:画一个小人,需要画头、身体、左手、右手、左脚和右脚。我们先定义一个抽象的建造人的类,来把这个过程给稳定住,不让任何人遗忘其中的任何一步。
当我们需要画一个瘦小人和一个胖小人的时候,我们还需要建造者模式中的一个很重要的类,指挥者(Director)来控制建造过程,也用它来隔离用户与建造过程的关联。
在这里插入图片描述
personBuilder.h

#pragma once

class PersonBuilder
{
public:
	virtual ~PersonBuilder() {}

	virtual void BuildHead() = 0;	  //画头部
	virtual void BuildBody() = 0;     //画身体
	virtual void BuildArmLeft() = 0;  //画左手
	virtual void BuildArmRight() = 0; //画右手
	virtual void BuildLegLeft() = 0;  //画左脚
	virtual void BuildLegRight() = 0; //画右脚
};

personThinBuilder.h

#pragma once

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

class PersonThinBuilder : public PersonBuilder
{
	void BuildHead() override
	{
		std::cout << "画瘦小人的头部" << std::endl;
	}
	void BuildBody() override
	{
		std::cout << "画瘦小人的身体" << std::endl;
	}
	void BuildArmLeft() override
	{
		std::cout << "画瘦小人的左胳膊" << std::endl;
	}
	void BuildArmRight() override
	{
		std::cout << "画瘦小人的右胳膊" << std::endl;
	}
	void BuildLegLeft() override
	{
		std::cout << "画瘦小人的左腿" << std::endl;
	}
	void BuildLegRight() override
	{
		std::cout << "画瘦小人的右腿" << std::endl;
	}
};

personFatBuilder.h

#pragma once

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

class PersonFatBuilder : public PersonBuilder
{
	void BuildHead() override
	{
		std::cout << "画胖小人的头部" << std::endl;
	}
	void BuildBody() override
	{
		std::cout << "画胖小人的身体" << std::endl;
	}
	void BuildArmLeft() override
	{
		std::cout << "画胖小人的左胳膊" << std::endl;
	}
	void BuildArmRight() override
	{
		std::cout << "画胖小人的右胳膊" << std::endl;
	}
	void BuildLegLeft() override
	{
		std::cout << "画胖小人的左腿" << std::endl;
	}
	void BuildLegRight() override
	{
		std::cout << "画胖小人的右腿" << std::endl;
	}
};

personDirector.h

#pragma once

#include "personBuilder.h"

class PersonDirector
{
public:
	PersonDirector(PersonBuilder *person) : m_person(person) {}
	void CreatePerson()
	{
		m_person->BuildHead();
		m_person->BuildBody();
		m_person->BuildArmLeft();
		m_person->BuildArmRight();
		m_person->BuildLegLeft();
		m_person->BuildLegRight();
	}

private:
	PersonBuilder *m_person;
};

客户端main.cpp

#include "personDirector.h"
#include "personThinBuilder.h"
#include "personFatBuilder.h"

int main()
{
	PersonBuilder *thinBuilder = new PersonThinBuilder();
	PersonDirector *thinDirector = new PersonDirector(thinBuilder);
	thinDirector->CreatePerson();

	std::cout << std::endl;
	PersonBuilder *fatBuilder = new PersonFatBuilder();
	PersonDirector *fatDirector = new PersonDirector(fatBuilder);
	fatDirector->CreatePerson();

	delete thinBuilder;
	delete thinDirector;
	delete fatBuilder;
	delete fatDirector;

	getchar();
	return 0;
}

运行结果:

画瘦小人的头部
画瘦小人的身体
画瘦小人的左胳膊
画瘦小人的右胳膊
画瘦小人的左腿
画瘦小人的右腿

画胖小人的头部
画胖小人的身体
画胖小人的左胳膊
画胖小人的右胳膊
画胖小人的左腿
画胖小人的右腿

在这里插入图片描述
product.h

#pragma once

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

class Product
{
public:
	void Add(const std::string &part)
	{
		m_patrs.push_back(part);
	}

	void Show()
	{
		std::cout << std::endl << "产品 创建 ---";
		for (const auto &part : m_patrs)
		{
			std::cout << part;
		}
	}

private:
	std::list<std::string> m_patrs;
};

builder.h

#pragma once

class Product;

class Builder
{
public:
	virtual ~Builder() {}
	virtual void BuildPartA() = 0;
	virtual void BuildPartB() = 0;
	virtual Product *GetResult() = 0;
};

concreteBuilder1.h

#pragma once

#include "builder.h"
#include "product.h"

class ConcreteBuilder1 : public Builder
{
public:
	ConcreteBuilder1() : m_product(new Product()) {}
	~ConcreteBuilder1()
	{
		delete m_product;
	}

	void BuildPartA() override
	{
		m_product->Add("部件A");
	}

	void BuildPartB() override
	{
		m_product->Add("部件B");
	}

	Product * GetResult() override
	{
		return m_product;
	}

private:
	Product *m_product;
};

concreteBuilder2.h

#pragma once

#include "builder.h"
#include "product.h"

class ConcreteBuilder2 : public Builder
{
public:
	ConcreteBuilder2() : m_product(new Product()) {}
	~ConcreteBuilder2()
	{
		delete m_product;
	}

	void BuildPartA() override
	{
		m_product->Add("部件X");
	}

	void BuildPartB() override
	{
		m_product->Add("部件Y");
	}

	Product * GetResult() override
	{
		return m_product;
	}

private:
	Product *m_product;
};

director.h

#pragma once

#include "builder.h"

class Director
{
public:
	void Construct(Builder * builder)
	{
		builder->BuildPartA();
		builder->BuildPartB();
	}
};

客户端main.cpp

#include "concreteBuilder1.h"
#include "concreteBuilder2.h"
#include "director.h"

int main()
{
	Director *director = new Director();
	Builder *b1 = new ConcreteBuilder1();
	Builder *b2 = new ConcreteBuilder2();

	director->Construct(b1);
	Product *p1 = b1->GetResult();
	p1->Show();

	director->Construct(b2);
	Product *p2 = b2->GetResult();
	p2->Show();

	delete director;
	delete b1;
	delete b2;

	getchar();
	return 0;
}

运行结果:

产品 创建 ---部件A部件B
产品 创建 ---部件X部件Y
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值