请教一个Factory模式的问题

rabbit729 2008-01-30 05:06:47
下面是我修改的一个关于Factory模式的代码,在里面添加了一个派生类ConcreteProduct1

/****************Factory.h************************/
class Product
{
public:
virtual ~Product() = 0;
protected:
Product();
private:
};
class ConcreteProduct:public Product
{
public:
~ConcreteProduct();
ConcreteProduct();
protected:
private:
};

class ConcreteProduct1:public Product
{
public:
~ConcreteProduct1();
ConcreteProduct1();
protected:
private:
};

class Factory
{
public:
virtual ~Factory() = 0;
virtual Product* CreateProduct() = 0;
protected:
Factory();
private:
};
class ConcreteFactory:public Factory
{
public:
~ConcreteFactory();
ConcreteFactory();
Product* CreateProduct();
protected:
private:
};

class ConcreteFactory1:public Factory
{
public:
~ConcreteFactory1();
ConcreteFactory1();
Product* CreateProduct();
protected:
private:
};

/****************Factory.cpp************************/

#include "Factory.h"
#include <iostream>
using namespace std;
Product::Product()
{
}
Product::~Product()
{
}
ConcreteProduct::ConcreteProduct()
{
cout<<"ConcreteProduct...."<<endl;
}
ConcreteProduct::~ConcreteProduct()
{
}

ConcreteProduct1::ConcreteProduct1()
{
cout<<"ConcreteProduce1...."<<endl;
}

ConcreteProduct1::~ConcreteProduct1()
{

}

Factory::Factory()
{
}
Factory::~Factory()
{
}
ConcreteFactory::ConcreteFactory()
{
cout<<"ConcreteFactory....."<<endl;
}
ConcreteFactory::~ConcreteFactory()
{
}
Product* ConcreteFactory::CreateProduct()
{
return new ConcreteProduct();
}

ConcreteFactory1::ConcreteFactory1()
{
cout<<"ConcreteFactory1....."<<endl;
}

ConcreteFactory1::~ConcreteFactory1()
{

}

Product* ConcreteFactory1::CreateProduct()
{
return new ConcreteProduct1();
}

/*****************test.cpp************************/

#include "Factory.h"

#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Factory* fac = new ConcreteFactory();
Product* p = fac->CreateProduct();

Factory* fac1 = new ConcreteFactory1();
Product* p1 = fac1->CreateProduct();
return 0;
}

程序输入为:
ConcreteFactory.....
ConcreteProduct....
ConcreteFactory1.....
ConcreteProduce1....
Press any key to continue
我的问题是:
Factory模型的提出就是为了解决下面的情况:
n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new ×××;的代码。这里带来两个问题1)客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了。),2)程序的扩展性和维护变得越来越困难。

但是现在通过上面的代码可以看出,虽然不用对派生类执行new操作了,但是必须对工厂的派生类分别进行new操作,也即上述测试程序中的:Factory* fac = new ConcreteFactory(); Factory* fac1 = new ConcreteFactory1();语句。这不是将问题转移了么?而没有从根本上解决问题?烦请大家给予指导,谢谢!!
...全文
231 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
visame 2008-02-13
  • 打赏
  • 举报
回复
标记学习!
yuanchuang 2008-02-12
  • 打赏
  • 举报
回复
但是现在通过上面的代码可以看出,虽然不用对派生类执行new操作了,但是必须对工厂的派生类分别进行new操作,也即上述测试程序中的: Factory* fac = new ConcreteFactory(); Factory* fac1 = new ConcreteFactory1();语句。这不是将问题转移了么?而没有从根本上解决问题?烦请大家给予指导,谢谢!!
==============
可能楼主和我起初一样,听人把设计模式说得神乎其神就信以为真了。
其实没什么无缘无故就消失了,无非是提前加以判断或者放在配置文件中之类。
你想想即使是虚拟函数,也是创建对象是判断了是创建那种类型的对象,使用动态绑定才使得调用时调用特定的函数。
像有些吹嘘设计模式的说法,说消除if、case语句等,都是偷换感念。比如state模式,其实接下来使用哪种state对象,本身就是一种判断,只是没有放在case语句中而已。

但是工厂模式有他的很明显的优点,比如你只需要判断工厂方法判断创建什么类型的抽象工厂对象,然后,就不用关心实现等,创建其特定的product,否则,你每创建一种类型的product都要考虑或判断当前该创建那种类型的product。
idot 2008-02-03
  • 打赏
  • 举报
回复
无论是具体工厂还是具体产品,其实例不是在代码中固定,而是通过程序外部设定,例如配置文件、操作系统环境等。
建议你看看Struts/Spring是如何利用配置文件进行实例化的,或者看看Java中的Swing是如何根据操作系统来显示
风格各异的窗口控件。
zsyddl2 2008-02-03
  • 打赏
  • 举报
回复
1 楼 正解.
aspnetwuxueyou3 2008-02-02
  • 打赏
  • 举报
回复
抽象工厂和工厂模式不是一回事。
比如你有solder, monster, bullet三个类。
创建每个类的模式叫做工厂模式。创建类的组合模式叫做抽象工厂(比如你想同时创建solder, monster, bullet,把他们组合起来使用)
昊叔 2008-02-01
  • 打赏
  • 举报
回复
你说的时简单工厂模式(其实叫工厂方法),作用不大,你用抽象工厂模式吧
rabbit729 2008-02-01
  • 打赏
  • 举报
回复
这个版怎么人气不望呀!
rabbit729 2008-01-31
  • 打赏
  • 举报
回复
谢谢楼上的回复!欢迎更多的高手给予指导!
cad_vc 2008-01-31
  • 打赏
  • 举报
回复
明天再来细看
wanglovec 2008-01-31
  • 打赏
  • 举报
回复
呵呵,这是一个很经典的问题, 可以用XML 映射解决。


当然 也可以用 BoXoft 的 参数化 工厂方法
BoXoft 2008-01-30
  • 打赏
  • 举报
回复
这个Factory有问题。修改:
CreateProduct(type)
{
if (type == "concrete")
return new ConcreteProduct();
else if (type == "concrete1")
return new Concrete1Product();
}

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧