设计模式学习笔记: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 theproduct>
class standardcreator:public creator
{
public:
virtual product* createproduct();
};
template <typename theproduct>
product* standardcreator<theproduct>::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 theproduct>
class standardcreator:public creator
{
public:
virtual product* createproduct();
};
template <typename theproduct>
product* standardcreator<theproduct>::createproduct()
{
return new theproduct();
}
#endif
然后是简单的实现:
[cpp] //factory.cpp
#include "factory.h"
#include <iostream>
using namespace std;
product* creator::getproduct()
{
if (nullptr == m_pproduct)
{
m_pproduct = createproduct();
}
return m_pproduct;
}
//factory.cpp
#include "factory.h"
#include <iostream>
using namespace std;
product* creator::getproduct()
{
if (nullptr == m_pproduct)
{
m_pproduct = createproduct();
}
return m_pproduct;
}
最后是测试代码:
[cpp] //test.cpp
#include "factory.h"
#include <iostream>
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<ourproduct> ourcreator;
product *pproduct = ourcreator.getproduct();
standardcreator<myproduct> mycreator;
pproduct = mycreator.getproduct();
standardcreator<yourproduct> yourcreator;
pproduct = yourcreator.getproduct();
char ch = getchar();
return 1;
}
//test.cpp
#include "factory.h"
#include <iostream>
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<ourproduct> ourcreator;
product *pproduct = ourcreator.getproduct();
standardcreator<myproduct> mycreator;
pproduct = mycreator.getproduct();
standardcreator<yourproduct> yourcreator;
pproduct = yourcreator.getproduct();
char ch = getchar();
return 1;
}
下面是测试效果:www.2cto.com
摘自 arvon zhang的专栏
上一篇: 信号究竟发给谁
下一篇: QT入门学习笔记1 - Hello Qt