首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于最简单的工厂方法模式解决办法

2012-03-08 
关于最简单的工厂方法模式研究了很久工厂方法模式,发现书上,网上说的都让人感觉理解不到位。就两个问题:1。

关于最简单的工厂方法模式
研究了很久工厂方法模式,发现书上,网上说的都让人感觉理解不到位。

就两个问题:

1。对于工厂方法模式,是不是一个工厂仅对应一个产品?(目前我的理解是这样的,如果不是一个工厂仅对应一个产品,就是说一个工厂会对应多个产品,那么如何实现呢?)请大侠们举例说明。(比如计算器,我理解到的计算器是一个工厂方法模式中的那个抽象工厂,那加,减,乘,除都是派生的工厂,每一个工厂中分别作加法,减法,乘法,除法的运算,这样就是一个工厂对应相当于一个产品。那现在为了满足开闭原则,有一乘方运算出来,就新写一个乘方运算的类继承计算器这个抽象工厂类,乘方运算自己是一工厂类,他能够做乘方运算,乘方运算相当于产品。我是这样理解的。)

但是看到别的例子,比如人做好事儿的例子,人是一抽象工厂,好事儿算是一抽象产品;工人,农民,学生等继承人,算是抽象工厂,扫地,拉垃圾,帮盲人过马路等算是具体的好事儿,继承于抽象好事儿类。

如果是这样的话,这是不是工厂方法模式?如果是,如果要满足一个工厂对应一个产品,那这个就不合理了,因为工人,农民,学生等都可以做各种好事儿。如何理解?


比如之前的客户端代码可以是这样:

main()
{
计算器* p计算器;
p计算器 = new 加法();
产品* p产品;
p产品 = p计算器->创建运算();
}

这里面,计算器类和产品类都是抽象类,但是计算器通过NEW 新搞出来了个加法,因此实例化延迟到加法工厂中去了,所得的产品也就是加法工厂创建运算的结果了,也就是在加法工厂中new一个加法(可以理解为new一个加法运算符)出来。


那之后的代码可能就是这样的:
main()
{
人* p人;
p人 = new 学生();
好事儿* p好事儿;
p好事儿 = p人->做好事儿();
}

这里面,人类和好事儿类都是抽象类,但是人通过NEW 新搞出来了个学生,因此实例化延迟到学生工厂中去了,所得的产品也就是学生工厂做好事儿的结果了。那这个做好事儿的方法里面是可以不唯一的,不一定要new那一种好事儿,所以这里将返回什么结果?还是这种就不是工厂方法模式呢?或者是什么?

求解答。

2。在实际开发中,什么时候会用到工厂方法模式。请举例说明。


注:请大侠们不要照着书啊,或者网上的说明什么的说理论了。例子上来便于理解。生活中的也成。

[解决办法]
我也正在学设计模式,网上有追mm与23种设计模式,看着还挺有意思

举个简单的小例子,是我的一点小理解,供楼主参考:
main()
{
电子工厂* p电子工厂;

计算器 *p计算器 = p电子工厂->调用电子工厂生产计算器的方法; 
手表* p手表 = p电子工厂->调用生产手表的方法;
}
——需要什么类型的对象,就可以向工厂申请,然后工厂负责生产,这里只用了一个电子工厂类,也可以通过计算器厂和手表厂继承电子工厂,来分别生产计算器和手表
[解决办法]
1。对于工厂方法模式,是不是一个工厂仅对应一个产品?
基本上来说,是的。

但是看到别的例子,比如人做好事儿的例子,人是一抽象工厂,好事儿算是一抽象产品;工人,农民,学生等继承人,算是抽象工厂,扫地,拉垃圾,帮盲人过马路等算是具体的好事儿,继承于抽象好事儿类。

对于这样的需求,我们的设计是,设计出一个抽象的好事儿工厂。然后派生出扫地工厂,扫垃圾工厂,帮盲人过马路工厂等等。

2。在实际开发中,什么时候会用到工厂方法模式。请举例说明。
工厂方法基本上被广泛应用。一般而言,只要是创建带有继承体系的类,都可以用工厂方法。比如我们可以实现一个动态创建系统:

C/C++ code
base *createClass(const char *className){    pClassManager = ...; // Get class manager.    baseFactory *pFactory = pClassManager[className];    return pFactory->create();}void init(void){    pClassManager->register(make_pair("derivedClass", new derivedClassFactory));}
[解决办法]
网上有工厂的代码。可以有不同的工厂,各工厂继承一个父类,各个工厂生产的产品是一个系列的。
注意抽象工厂和工厂模式的不同。
想要系统学习,看设计模式吧
[解决办法]
我主要的问题在于:是不是一个工厂只负责生产一个产品?
是。

人* p人;
p人 = new 学生工厂();
好事儿* p好事儿;
p好事儿 = p人->做好事儿();

并不知道学生做的好事儿是什么啊。。。就是说学生工厂里不单一做一件好事儿。
多态就是不需要知道具体类型。因此不需要知道学生做的好事儿是什么。

人* 人工厂::做好事儿()
{
人 *p人 = new 人();
return p人;
}

人工厂不需要做好事。人工厂只负责产生人。
人(学生,工人)才需要做好事。
代码如下:

C/C++ code
class Person{public:    Good *doGood(void) = 0;};class Student : public Person{public:    Good *doGood(void);};Good *Student::doGood(void){    // 获取某种具体类型的做好事工厂。    SomeSpecificGoodFactory factory;    // 用工厂创建出具体的好事。    return factory->create();}
[解决办法]
我觉得,在工厂模式中,工厂不是负责生产一个产品的,而是负责生产同一系列的产品的,这个同一系列的概念就是从同一个抽象类继承来。
比如上面说的计算器,在计算器中应该是有一个符号工厂,而这个符号工厂就是负责产生加减乘除这一系列符号的,而这一系列符号都是从同一系列符号都是从符号类继承来的。
而第二个问题具体什么时候用,我觉得还是得楼主自己体会。
[解决办法]
接6楼的例子
C/C++ code
class A{    virtual void todo() = 0;};class B : public A{  void todo()  {  //todo  }};class C : public A{  void todo()  {  //todo  };};//Factoryclass Factory{public:    A *Get(int type)    {        switch(type)        {        case ProductB:                 return new B();        case ProductC:                 return new C();        default:            return NULL;        }    }};int main(){    Factory *f = new Factory();    A *p = f->Get(ProductB);    return 0;} 


[解决办法]
是不是一个工厂只负责生产一个产品?

不是。

在工厂模式中,工厂不是负责生产一个产品的,而是负责生产同一系列的产品的,这些产品在某个特性上有不同.
[解决办法]
7楼不已经给了例子了啊 ~
[解决办法]
哎,不知道楼主要啥,是要抽象工厂吗?抽象工厂就是把工厂类抽象出来
是要这样的吗?
其实上面的UML图只是简单例子,可以自己扩展
[解决办法]
图太大了 晕死
[解决办法]
就是每个派生出来的工厂可以生产多个系列的产品~~
[解决办法]
工厂应该是能产生多种对象产品的
你可以做一个运算工厂,来生产加法对象、减法对象、乘法对象等
可以做一个加法工厂,来生产整数加法、小数加法、复数加法等
可以做一个手机工厂,来生产翻盖手机、直板手机、滑盖手机

可以看看《大话设计模式》,挺有意思的一本书
[解决办法]
所谓工厂,就是生产对象实例的类。把对象实例化的逻辑交给工厂实现。为什么要这样呢?

1、有一系列的类(即产品类)的对象需要实例化,而且这一系列的类可以被以被抽象到相同的接口;

2、能够扩展这个类的系列,且对客户端不产生大的影响(客户端只使用“抽象接口”,而不需知道被调用对象的是这一系列类中的具体哪个类型);


同时,简单工厂、工厂方法、抽象工厂这三者在产品类的实例化逻辑上有一定不同:

1、简单工厂:客户端要以一定的方式(例如传递参数、配置信息等方式)告知工厂,然后工厂再具体实例化客户端需要的产品类型的实例,但返回的是抽象接口。其中,根据客户端的要求,工厂选择合适的产品类类型的逻辑是在工厂内部,当扩展产品类数量的时候,面临着修改的需求。

2、工厂方法:当客户端需要某个确定的产品类对象实例时,先直接实例化某个工厂类的对象(工厂的抽象接口),然后再有这个工厂类对象实例实例化客户端真正需要的产品类对象实例(产品的抽象接口)。很明显在简单工厂、工厂方法这两种模式中,客户端在具体的产品类类型的选择过程,其选择逻辑的实现方式和位置是不同的。继续保留了产品类易扩展的特点,同时还改善了由于扩展带来的选择逻辑修改的风险。

3、抽象工厂:选择逻辑类似于工厂方法。但工厂方法相是依据单个产品类特征作出选择,而抽象工厂是依据所有产品类的共同特征作出选择的。如果说把抽象工厂看作是由一些工厂合成的工厂,那么一次选择意味着同时选择了多个工厂(工厂方法中的工厂)。
[解决办法]

探讨

大话设计模式是看完了,他里面那个雷锋的例子说的不是太好。

楼上说的是什么意思?


加法工厂生产的产品是一个加法符号,而不是整数加法,小数加法吧。。。。

我的问题其实很简单,就是问是不是一个具体工厂只生产一个具体产品。

比如:

一个抽象工厂A,有3个具体工厂继承这个抽象工厂AC1,AC2,AC3
一个抽象产品B, 有3个具体产品继承这个抽象产品B1,B2,B3
……

[解决办法]
工厂方法的优势就在于一个工厂可以生产很多具有类似属性的产品,如果一个工厂只生产一个产品那就没有意义了。

[解决办法]
以图形类为例:
class CGraph;
class CRectangle : public CGraph
class CTriangle : public CGraph
class CElipse : public CGraph

CGraph *GraphFactory(const int GraphType);

CRectangle *Rect = dynamic_cast<CRectangle*>(GraphFactory(GRAPH_TYPE_RECT));

热点排行