MyException - 我的异常网
当前位置:我的异常网» C++ » 关于最简单的工厂方法模式解决办法

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

www.MyException.Cn  网友分享于:2013-03-09  浏览:24次
关于最简单的工厂方法模式
研究了很久工厂方法模式,发现书上,网上说的都让人感觉理解不到位。

就两个问题:

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
  };
};

//Factory
class 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;
}

文章评论

程序员应该关注的一些事儿
程序员应该关注的一些事儿
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
为什么程序员都是夜猫子
为什么程序员都是夜猫子
一个程序员的时间管理
一个程序员的时间管理
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
总结2014中国互联网十大段子
总结2014中国互联网十大段子
鲜为人知的编程真相
鲜为人知的编程真相
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
老程序员的下场
老程序员的下场
Java程序员必看电影
Java程序员必看电影
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
旅行,写作,编程
旅行,写作,编程
程序员和编码员之间的区别
程序员和编码员之间的区别
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
代码女神横空出世
代码女神横空出世
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
那些争议最大的编程观点
那些争议最大的编程观点
中美印日四国程序员比较
中美印日四国程序员比较
如何成为一名黑客
如何成为一名黑客
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
漫画:程序员的工作
漫画:程序员的工作
我的丈夫是个程序员
我的丈夫是个程序员
程序员都该阅读的书
程序员都该阅读的书
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员的鄙视链
程序员的鄙视链
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
 程序员的样子
程序员的样子
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
编程语言是女人
编程语言是女人
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我是如何打败拖延症的
我是如何打败拖延症的
每天工作4小时的程序员
每天工作4小时的程序员
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有