白话设计模式--抽象工厂(AbstractFactory)

 

          一直觉得设计模式是非常抽象的(事实上MS也是。。。),所以就想把它说的白话点儿,让人更容易理解。

          关于抽象工厂(Abstract Factory)模式,网上一个非常流行的例子,麦当劳和肯德基的故事。具体怎么说的我已经忘了,但是我想自己描述一遍,希望能让自己加深对设计模式思想的理解,也希望对大家有所帮助。

           既然叫抽象工厂,那一定有工厂(废话)。那么我们可以认为麦当劳和肯德基就是生产食物的工厂,那么理所当然,汉堡和鸡腿是他们共同生产的两种食物,不管你去MDL还是KDJ,说:我要鸡腿,那肯定不会给你拿来烤羊腿。嘿嘿 。这里,我们假定麦当劳和肯德基只生产这两种产品(这很重要,因为抽象工厂模式的一个很重要的场景就是产品相对稳定,如果要经常新增新产品,那么需要和另外的设计模式混合使用或寻求其它解决方案,这里不赘述)。

           情况已经很明显了,我们是消费者,我们就是客户,就是产品的消费者,就是程序中对象的调用者。而麦当劳和肯德基,理所当然的,他们就是工厂,一个叫做麦当劳工厂,一个叫做肯德基工厂,他们是真正的生产者,而对于我们这些客户消费者(程序中对象的调用者)来说,不管是去麦当劳还是肯德基,我们都说一样的话(我们的要求是稳定的):我要鸡腿。只要我们提出这个请求,那么肯定会得到我们想要的。而作为工厂(生产者),麦当劳和肯德基都生产鸡腿和汉堡,所以抽象出来的抽象工厂都具有生产鸡腿和生产汉堡的功能,这是接口中的两个方法。因为在这个接口中,还不知道到底要生产谁家的产品,所以只能返回个抽象的鸡腿或汉堡,等到麦当劳或者肯德基工厂生产出来,就知道是谁家的了。(有标志嘛,哈哈,这就是动态创建对象)

            不管是麦当劳还是肯德基的鸡腿或汉堡,它的本质都是鸡腿或汉堡,所以可以抽象出来。那么鸡腿就派生出麦当劳的鸡腿和肯德基的鸡腿,而汉堡就派生出麦当劳的汉堡和肯德基的汉堡。而对于我们这些客户消费者(程序中对象的调用者)来说,不管是去麦当劳还使肯德基,我们都说一样的话(我们的要求是稳定的):我要鸡腿。只要我们提出这个要求,那么肯定会得到我们想要的。不管是谁家的鸡腿,肯定是鸡腿不会是羊腿。所以,我们只要规定好是鸡腿(接口)就行了,而让工厂去绝对具体的制作过程。我们只伸手接过来一个鸡腿,狠狠的咬一口,恩,真香~:)

            到现在为止,我们只和鸡腿(抽象的接口)还有抽象工厂(因为我们不管是麦当劳还是肯德基,我们只要鸡腿)打交道。

            当我们走向一个快餐店,这个过程就决定了我们到底要哪个工厂来生产鸡腿和汉堡。我们可以把我们消费的习惯存入大脑,每次出门直接取出来,就只管走就行了。也不用看到底是走向了哪里,反正最后吃了好多鸡腿和汉堡,饱饱的走了。:)哈哈   理论讲解完毕,那么现在看看UML图。

           

 

        那么,现在,大家应该已经看清楚。这张图是我自己随手画的,画完之后发现,哇,这不就是经典的AbstractFactory模式的那张图吗?现在,你了解吗?

        必胜客来了,也做汉堡和鸡腿。那么怎么办呢?非常容易,我们消费者根本不管这些,只管把必胜客加入我们的大脑(配置文件),需要的时候,直接走进去就行了。仅仅需要添加一个必胜客工厂,必胜客汉堡,必胜客鸡腿,OK,一切搞定。那么又有人问了,我要喝汽水怎么办呢?我偷偷告诉你,这里不卖~:)哈哈,希望大家学习愉快,工作愉快

posted on 2008-08-12 16:50 GodSpeed 阅读(1906) 评论(9)  编辑 收藏 网摘

评论

#1楼  2008-08-12 17:15 不若相忘于江湖      

不错。 但放首页有点。。。   回复  引用  查看    

#2楼  2008-08-12 17:42 钢钢      

可以参考一下我的这篇:
Abstract Factory 抽象工厂设计模式
http://www.cnblogs.com/xugang/archive/2008/06/11/1217227.html
  回复  引用  查看    

#3楼  2008-08-13 11:00 垃圾处理类 [未注册用户]

如果不是你的智商有问题,那就是你试图把读者都当弱智.地球人都知道的东西,扯了这么远.不可思议的是还扯的津津有味.   回复  引用    

#4楼  2008-08-13 14:13 suyao [未注册用户]

@垃圾处理类
我觉得楼主说的很浅显易懂,比起某些教科书式的博客大有优势。既然是博客,就应该让更多的人看懂,而不是像教科书一样炫耀自己的专业(而让人难以理解)。   回复  引用    

#5楼  2008-08-13 15:39 v3 [未注册用户]

不错的   回复  引用    

#6楼 [楼主] 2008-08-14 09:13 GodSpeed      

谢谢大家支持~
我是个初学者,我仅仅是想从一个初学者的角度描述设计模式,让刚刚开始接触设计的同志更容易入门   回复  引用  查看    

#7楼  2008-08-21 23:57 飞天小肥猪(膘叔)      

--引用--------------------------------------------------
垃圾处理类: 如果不是你的智商有问题,那就是你试图把读者都当弱智.地球人都知道的东西,扯了这么远.不可思议的是还扯的津津有味.
--------------------------------------------------------
我估计您一定是位高手,不需要人教你就知道模式是什么东西了。这东西对你来说简单了。你写东西一定也是信手拈来的。地球人都知道1+1=2,可是,有几个人能够证明得出?我估计您一定是其中之一   回复  引用  查看    

#8楼  2008-08-26 15:53 asdf12 [未注册用户]

--引用--------------------------------------------------
suyao: @垃圾处理类
我觉得楼主说的很浅显易懂,比起某些教科书式的博客大有优势。既然是博客,就应该让更多的人看懂,而不是像教科书一样炫耀自己的专业(而让人难以理解)。
--------------------------------------------------------


你就一LJ,今天心情不太爽

LZ写得非常不错.   回复  引用    

#9楼  2008-09-16 08:42 xman - No.1 [未注册用户]

写的很好

国内的很多计算机书看起来比天书都难,而去看看一些国外的这方面书籍
有些甚至用卡通漫画 来描述程序步骤流程 内存处理结构
让人一看就懂
这就是差距!!
写书不是为了炫耀自己 而是要让读者一看就懂!

支持楼主!   回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接:
 
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

与我联系

搜索

 

常用链接

留言簿

我参加的小组

我参与的团队

我的标签

随笔档案(43)

最新评论

阅读排行榜

评论排行榜