设为首页 加入收藏

TOP

设计模式学习笔记:factory method(工厂方法)(一)
2014-11-24 00:40:20 来源: 作者: 【 】 浏览:78
Tags:设计模式 学习 笔记 factory method 工厂 方法
工厂方法是一种对象创建型模式,它的目的是定义一个用于创建对象的接口,让子类决定实例化哪一个类,可以使一个类的实例化延迟到子类。
适用场景
工厂方法适用于一下几种情况:
1)当一个类不知道它所必须创建的对象的类的时候;
2)当一个类希望由它的子类来指定它所创建的对象的时候;
3)当类将创建对象的职责委托给多个帮助子类中的一个;
模式结构
下面我们来看一下工厂方法的模式结构以便对其有一个全局的了解,如图所示:

\

参与者

很显然,从上面的模式结构中我们可以看出工厂方法主要有4个主要参与者。

1)Product

定义工厂方法所创建对象的接口。

2)concreteProduct

实现对象创建的接口。

3)Creator

声明工厂方法以返回Product对象,也可以定义缺省的实现,返回一个缺省的ConcreteProduct对象,另外在Creator中也可以调用工厂方法以创建一个Product对象,稍后在代码中有体现,具体主要GetProduct()方法和CreateProduct()方法。

4)ConcreteCreator

重定义CreateProduct()方法返回一个具体的ConcreteProduct实例。

另外,Creator如果想创建一个具体的ConcreteProduct实例,则依赖于它的子类,如ConcreteCreator,这样就造成一个潜在的问题--可能仅为了创建适当的Product对象而被迫创建Creator类的子类,在C++中的一种解决方案是使用模板。

实现

下面通过代码实现上述工厂方法,类中具体的操作与上图有出入,主要为体现这种思想--延迟创建。

首先是各类的声明以及继承体系:


[cpp] //factory.h
#ifndef FACTORY_H
#define FACTORY_H

class Product
{
};

class Creator
{
public:
Creator():m_pProduct(nullptr){};
Product* GetProduct();
virtual Product* CreateProduct()=0;
private:
Product *m_pProduct;
};

/*针对上述潜在问题,这里提供一种解决方案
*1)提供一个Creator类的模板子类,用Product类作为模板参数
*2)这样做可以减少类的创建
*/

template
class StandardCreator:public Creator
{
public:
virtual Product* CreateProduct();
};

template
Product* StandardCreator::CreateProduct()
{
return new TheProduct();
}
#endif
//factory.h
#ifndef FACTORY_H
#define FACTORY_H

class Product
{
};

class Creator
{
public:
Creator():m_pProduct(nullptr){};
Product* GetProduct();
virtual Product* CreateProduct()=0;
private:
Product *m_pProduct;
};

/*针对上述潜在问题,这里提供一种解决方案
*1)提供一个Creator类的模板子类,用Product类作为模板参数
*2)这样做可以减少类的创建
*/

template
class StandardCreator:public Creator
{
public:
virtual Product* CreateProduct();
};

template
Product* StandardCreator::CreateProduct()
{
return new TheProduct();
}
#endif

然后是简单的实现:

[cpp] //factory.cpp
#include "factory.h"
#include

using namespace std;

Product* Creator::GetProduct()
{
if (nullptr == m_pProduct)
{
m_pProduct = CreateProduct();
}
return m_pProduct;
}
//factory.cpp
#include "factory.h"
#include

using namespace std;

Product* Creator::GetProduct()
{
if (nullptr == m_pProduct)
{
m_pProduct = CreateProduct();
}
return m_pProduct;
}

最后是测试代码:


[cpp] //test.cpp
#include "factory.h"
#include

using namespace std;

//客户只需提供不同的产品类,便可以使用统一的方法创建产品。
class MyProduct:public Product
{
public:
MyProduct()
{
cout << "MyProduct has been constructed!" << endl;
}
};

class YourProduct:public Product
{
public:
YourProduct()
{
cout << "YourProduct has been constructed!" << endl;
}
};

class OurProduct:public Product
{
public:
OurProduct()
{
cout << "OurProduct has been constructed!" << endl;
}
};

int main()
{
StandardCreator ourCreator;
Product *pProduct = ourCreator.GetProduct();
StandardCreator myCreator;
pProduct = myCreator.GetProduct();
StandardCreator yourCreator;
pProduct = yourCreator.GetProduct();

char ch = getchar();
return 1;
}
//test.cpp
#include "factory.h"
#include

using namespace std;

//客户只需提供不同的产品类,便可以使用统一的方法创建产品。
clas

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言初级教学之百钱买百鸡的循环.. 下一篇C、C++语言容易出错的几个地方

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: