这两天研究了一下c++的simple factory pattern, 颇有一些心得,记录下来,与大家共享
首先感谢一下参考的内容
关于simple factory pattern,其实就是使用者通过生产者提供的接口来获取产品, 就像早上我想吃鸡蛋,就到楼下的小卖店,透过小窗户跟老板说: “来个卤蛋”, 于是卤蛋就递出来了, 然后我还想喝杯牛奶,“老板,再来包牛奶”,牛奶也从小窗户里边出来了,但是牛奶跟卤蛋是怎么来的,我就不关心了
在下面这个例子中,可以把class factory 当做小卖店的小窗子,我把卤蛋, 牛奶这些名词当做参数传进去,于是卤蛋,牛奶这些实体就出来了, product 这个类是指小卖店里所有的货物,CreateProduct_A 和CreateProduct_B 就是在哪里拿牛奶,卤蛋。
恩, 我觉得这样解释挺清楚的, 其实这也是我喜欢1号作者实现方式的原因,我觉得他是比较好的实现了simple factory pattern, 因为所有的实现都是通过一个接口来实现的,只是获取不同资源时传递的参数不同, 就像你要卤蛋是时候要跟老板说 来个卤蛋 一样的道理, 但是2号作者的实现我觉得就不是很好, 在2号作者的实现里边,如果要获取不同资源,需要自己调用不同的实现,感觉就像是你去小卖店买卤蛋不是老板从窗口给你递出来,而是自己去后面拿一样,感觉实现方法有点不地道..... 不过,不得不说2号作者的代码风格非常好, 值得借鉴!
下面是我写的一些代码,供参考
#include <iostream>
#include "factory.h"
int main()
{
product *pa = factory::create_product(PRODUCT_A);
pa->operation();
product *pb = factory::create_product(PRODUCT_B);
pb->operation();
delete pa;
delete pb;
return 0;
} |
2. factory.cpp
/**
* filename: factory.cpp
* author: thomas
* created: 2010-12-28
*/
#include "factory.h"
using namespace std;
product::product()
{
}
product::~product()
{
}
void CreateProduct_A::operation()
{
cout<<"CreateProduct operation A"<<endl;
}
CreateProduct_A::CreateProduct_A()
{
cout<<"CreateProduct_A construction "<<endl;
}
CreateProduct_A::~CreateProduct_A()
{
cout<<"CreateProduct_A destruction "<<endl;
}
void CreateProduct_B::operation()
{
cout<<"CreateProduct operation B"<<endl;
}
CreateProduct_B::CreateProduct_B()
{
cout<<"CreateProduct_B construction "<<endl;
}
CreateProduct_B::~CreateProduct_B()
{
cout<<"CreateProduct_B destruction"<<endl;
}
factory::factory()
{
cout<<"factory "<<endl;
}
factory::~factory()
{
cout<<"~factory"<<endl;
}
product *factory::create_product(PRODUCT_TYPE ptype)
{
if(PRODUCT_A == ptype)
{
return new CreateProduct_A();
}
else if(PRODUCT_B == ptype)
{
return new CreateProduct_B();
}
else
return NULL;
} |
3. factory.h
/**
* filename: factory.h
* author: thomas
* created: 2010-12-28
*/
#ifndef _FACTORY_H
#define _FACTORY_H
#include <iostream>
class product
{
public:
virtual ~product();
virtual void operation() = 0;
protected:
product();
};
class CreateProduct_A : public product
{
public:
CreateProduct_A();
~CreateProduct_A();
public:
virtual void operation();
};
class CreateProduct_B : public product
{
public:
CreateProduct_B();
~CreateProduct_B();
public:
virtual void operation();
};
enum PRODUCT_TYPE{PRODUCT_A, PRODUCT_B};
class factory
{
public:
virtual ~factory() = 0;
static product *create_product(PRODUCT_TYPE ptype);
protected:
factory();
};
#endif
|
btw:
在写代码中出现一个问题,我将product 的construct 和deconstruct 放到了factory.h 文件中,于是出现了重复定义的错误,后来在小乔老师的指导下才知道原因,因为factory.cpp 和main.cpp同时包含了factory.h 所以才出现了重复定义的错误,解决问题的方法很简单,两种方法均可
1. 将product 的construct 和 deconstruct 放到factory.h 中类的定义那一块
2. 将product 的 construct 和 deconstruct 放到factory.cpp 里
阅读(1039) | 评论(0) | 转发(0) |