简介
Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
作用
建造者模式是将一个复杂对象和他的构造和组装过程分离,这样再重复创建不同对象时使用相同的流程进行建造。对于调用者来说,只需要知道产品的类型,而不需要知道具体的组装过程。
应用场景
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。
代码如下:
#include <iostream>
#include <string>
//人 基类
class abstract_person
{
public:
abstract_person(void){}
~abstract_person(void){}
public:
void set_name(std::string name){ m_name = name; }
void set_head(int num){ m_head = num; }
void set_leg(int num){ m_leg = num; }
void set_arm(int num){ m_arm = num; }
void print_result(void)
{
std::cout << "My name is " << m_name << ", head : "
<< m_head << ", leg : " << m_leg << ", arm : "
<< m_arm << " ."<< std::endl;
}
private:
std::string m_name;
int m_head = 0;//c++11支持这种写法
int m_leg = 0;
int m_arm = 0;
};
class builder
{
public:
builder(void){ m_person = new abstract_person; }
virtual ~builder(void){ delete m_person; }
public:
virtual abstract_person *get_person() = 0;
virtual void set_name(void) = 0;
virtual void set_head(void) = 0;
virtual void set_leg(void) = 0;
virtual void set_arm(void) = 0;
public:
abstract_person *m_person = nullptr;
};
//蓝胖 建造者
class lan_pang_bld : public builder
{
public:
lan_pang_bld(void){}
~lan_pang_bld(void){}
public:
virtual abstract_person *get_person(){ return m_person; }
virtual void set_name(void){ m_person->set_name("lan_pang"); }
virtual void set_head(void){ m_person->set_head(2); }
virtual void set_leg(void){ m_person->set_leg(2); }
virtual void set_arm(void){ m_person->set_arm(2); }
};
//大娜迦 建造者
class big_najia_bld : public builder
{
public:
big_najia_bld(void){}
~big_najia_bld(void){}
public:
virtual abstract_person *get_person(){ return m_person; }
virtual void set_name(void){ m_person->set_name("big_najia"); }
virtual void set_head(void){ m_person->set_head(1); }
virtual void set_leg(void){ m_person->set_leg(0); }
virtual void set_arm(void){ m_person->set_arm(2); }
};
//指挥者
class director
{
public:
director(builder *bld){ m_builder = bld; }
~director(void){}
public:
void construct(void)
{
m_builder->set_name();
m_builder->set_head();
m_builder->set_leg();
m_builder->set_arm();
}
public:
builder *m_builder;
};
int main()
{
std::cout << "start-up .." << std::endl;
big_najia_bld hero1;
lan_pang_bld hero2;
director dir1(&hero1);
dir1.construct();
director dir2(&hero2);
dir2.construct();
hero1.get_person()->print_result();
hero2.get_person()->print_result();
std::cout << "done .." << std::endl;
return 0;
}
执行结果: