接着设计模式-创建模式-三种工厂模式总结,考虑一个有更多属性的对象。在工厂模式种,一个对象在被构造时可能需要很多的构造参数,或者在刚new出来对象之后,还不算是完全体,还需要很多的属性设置步骤,对于这种情况,可以换一种思路来考虑。对于一个复杂的对象,用类区分会非常吃力,那不如完全用复杂的属性来区分,这样我们就可以考虑使用建造者模式。
对应工厂模式的概念,建造者模式首先有一个产品的原型,从原型到产品的过程就是对各种属性的设置过程。这样,一个产品就对应了一套特定的设置,一套特定的设置方法就对应一个建造器。在本文建造者模式的演示中,为了更有一般性,建造的对象是一个物体。这里面还有一个角色就是用建造器进行建造的建造者。
以下代码定义了物体类。这种物体有2个部分,每个部分有2种风格。
#include <iostream>
using namespace std;
enum Part0Style
{
Part0Style0,
Part0Style1,
};
enum Part1Style
{
Part1Style0,
Part1Style1,
};
class Object
{
private:
Part0Style part0Style;
Part1Style part1Style;
public:
void SetPart0(Part0Style style)
{
part0Style = style;
}
void SetPart1(Part1Style style)
{
part1Style = style;
}
void Display(void)
{
cout<<"Part0 style="<<part0Style<<",Part1 style="<<part1Style<<endl;
}
};
以下代码定义了一个建造器抽象类,子类必须分别实现建造物体两部分的具体风格。
class Builder
{
public:
virtual void BuildPart0()=0;
virtual void BuildPart1()=0;
virtual Object* GetObject()=0;
};
以下代码分别定义了两个建造器,分别是专门用于建造“第一部分是风格0,第二部分是风格1”的物体和“第一部分是风格1,第二部分是风格0”的物体的。
class Object01Builder:public Builder
{
private:
Object* m_pObject;
public:
Object01Builder():m_pObject(new Object()){}
void BuildPart0()
{
m_pObject->SetPart0(Part0Style0);
}
void BuildPart1()
{
m_pObject->SetPart1(Part1Style1);
}
Object* GetObject()
{
return m_pObject;
}
};
class Object10Builder:public Builder
{
private:
Object* m_pObject;
public:
Object10Builder():m_pObject(new Object()){}
void BuildPart0()
{
m_pObject->SetPart0(Part0Style1);
}
void BuildPart1()
{
m_pObject->SetPart1(Part1Style0);
}
Object* GetObject()
{
return m_pObject;
}
};
以下代码定义了建造者,它执掌着一个建造器进行建造工作。
class Director
{
private:
Builder* m_pBuilder;
public:
Director(Builder* builder):m_pBuilder(builder){}
void BuildObject()
{
m_pBuilder->BuildPart0();
m_pBuilder->BuildPart1();
}
};
以下代码是对建造者模式的使用。基本套路是,先new一个特定风格的建造器,再用它new一个建造者,建造者执行建造任务后,用户可以从建造器中拿到建造完成的物体对象,最后对物体进行一次使用(调用Display
)。
int main(void)
{
Builder* builder = new Object01Builder();
Director* director = new Director(builder);
director->BuildObject();
Object *object = builder->GetObject();
object->Display();
delete director;
delete builder;
delete object;
builder = new Object10Builder();
director = new Director(builder);
director->BuildObject();
object = builder->GetObject();
object->Display();
delete director;
delete builder;
return 0;
}
输出
Part0 style=0,Part1 style=1
Part0 style=1,Part1 style=0
网友评论