您的位置:首页 > 产品设计 > UI/UE

设计模式学习之生成器模式与实例

2017-09-11 22:53 441 查看

使用意图:

将一个复杂对象的构建与他的表示分离,是的同样的构建过程可以创建不同的表示

参与者:

1 抽象生成器(builder)

构造一个使用生成器的接口

2 具体生成器(concreteBuilder)

实现抽象生成器的接口和装配改产品的各个部件

定义并明确它所创建的表示

提供一个检索产品的接口(getProduct)

3 产品(product)

表示被构建的复杂对象,具体的生成器对象创建该产品内部的表示并定义它的装配过程

包含定义组成部件的类,包括将这些部件组装成最终的产品

4 导向器(Director)

构造一个使用生成器的对象

适用性

当创建复杂对象的算法应该独立于该对象的组成部分一起他们的装配方式时

当构造的过程必须允许被构造的对象有不同的表示时

实例:

(实例参考自:http://blog.csdn.net/xufeng0991/article/details/50267803):
//产品类
class CComputer
{
public:
void setCPU(string strCPU)
{
m_strCPU = strCPU;
}
void setMonitor(string strMonitor)
{
m_strMonitor = strMonitor;
}
void setHost(string strHost)
{
m_strHost = strHost;
}
void displayConfigInfo()
{
cout <<"CPU: "<< m_strCPU.c_str() << endl;
cout << "Host: " << m_strHost.c_str() << endl;
cout <<"Monitor: "<< m_strMonitor.c_str() << endl;
}
private:
string m_strCPU;
string m_strMonitor;
string m_strHost;
};

//抽象生成器类
class CBuilder
{
public:
virtual void makeCPU() = 0;
virtual void makeMonitor() = 0;
virtual void makeHost() = 0;
virtual CComputer* getComputer() = 0;
};

//具体生成器类
class CDellBuilder : public CBuilder
{
public:
CDellBuilder()
{
m_Computer = new CComputer();
}

virtual ~CDellBuilder()
{
if (m_Computer != NULL)
{
delete m_Computer;
m_Computer = NULL;
}
}
void makeCPU()
{
m_Computer->setCPU("Dell CPU");
}
void makeMonitor()
{
m_Computer->setMonitor("Dell Monitor");
}
void makeHost()
{
m_Computer->setHost("Dell Host");
}
CComputer* getComputer()
{
return m_Computer;
}
private:
CComputer* m_Computer;
};

//具体生成器类
class CASUSBuilder : public CBuilder
{
public:
CASUSBuilder()
{
m_Computer = new CComputer();
}

virtual ~CASUSBuilder()
{
if (m_Computer != NULL)
{
delete m_Computer;
m_Computer = NULL;
}
}
void makeCPU()
{
m_Computer->setCPU("ASUS CPU");
}
void makeMonitor()
{
m_Computer->setMonitor("ASUS Monitor");
}
void makeHost()
{
m_Computer->setHost("ASUS Host");
}
CComputer* getComputer()
{
return m_Computer;
}
private:
CComputer* m_Computer;
};

//使用生成器接口对象的类
class CDirector
{
public:
CDirector(CBuilder* builder)
{
m_builder = builder;
}

void constuct()
{
m_builder->makeCPU();
m_builder->makeMonitor();
m_builder->makeHost();
}
private:
CBuilder* m_builder;
};

int main(int argc, char* argv[])
{
printf("Start !!\n");
system("pause");
CDirector * direc = NULL;
CBuilder* builder = NULL;

builder = new CDellBuilder();
direc = new CDirector(builder);
direc->constuct();
builder->getComputer()->displayConfigInfo();
system("pause");

delete builder;
builder = NULL;

delete direc;
direc = NULL;

builder = new CASUSBuilder();
direc = new CDirector(builder);
direc->constuct();
builder->getComputer()->displayConfigInfo();
system("pause");

delete builder;
builder = NULL;

delete direc;
direc = NULL;

return 0;
}
补充 当我们需要新增一种新的创建方式时,我们只需要重新实现一个具体的生成器类就行了。

总结:感觉生成器模式和工厂方法模式也差不多。但他们的重点也不一样。生成器模式这种于将负复杂的创建模式一步步分解,如上面的实例中将分别调用makeFloor、makeDoor等函数最后返回产品对象。工厂模式是立即返回了产品对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息