全部博文(2759)
分类: 架构设计与优化
2014-01-08 04:26:35
原文地址:为什么说问新人设计模式最不靠谱了 作者:invincibleLiu
如果你是像作者一样参加工作一年有多了,看完此文后,请立即去拿回属于你们的财富——设计模式吧
事情经过是这样的,面试官问到什么是抽象工厂设计模式,我们先来看看什么是简单工厂模式
其中Factory代码是这样的
点击(此处)折叠或打开
Class.forName,用过spring类似框架的再熟悉不过了,这里用来演示简单工厂创建一个对象;其实简单工厂就算刚学会java的同学也好理解:要什么、只用提供一个简简单单的字符串或者别的信息,就能返回一个复杂的对象,但是抽象工厂呢?作者当年着实没能理解,反复看了好几遍也没能,最多背下来,可是设计模式不比算法,背下来什么用都没有(其实有些算法背下来也是无用的)顺着上面这个造苹果的例子,我们再造个三星,就能“很好”的理解抽象工厂了。
抽象工厂,5个字解释就是————工厂的工厂:因为三星也有对应的手持通讯设备以及平板娱乐设备,我们做一个抽象EProductCommunication,EProductEntertainment,且工厂也抽出一个通用工厂来,专门生产苹果工厂or三星工厂,类图如下
点击(此处)折叠或打开
苹果工厂的实现
点击(此处)折叠或打开
苹果产品对两个接口的实现:
点击(此处)折叠或打开
类图如下
大家可能有注意到,为什么我对产品种类做的抽象,而不是品牌,如果能敏锐的发现这一点,你离使用抽象工厂最高境界很近了(*^__^*)
没错,我可以对品牌做抽象,做成如下:
点击(此处)折叠或打开
EProductApple下面有iPhone跟iPad两个实现,大家对比一下,除了做了一下类似线代里面的转置,以品牌为导向的抽象工厂与以种类为导向的抽象工厂完全相似,但是他们对应的业务场景完全相反,为什么这么说,假如乔布斯醒来了,搞了一种叫iWatch的产品,戴在头上,总之很牛逼的样子,三星等周围厂商纷纷效仿,请问上面哪种抽象工厂改动最少?
以产品为导向的:修改SuperFactory增加一个新的方法
点击(此处)折叠或打开
并且实现了SuperFactory的类也得跟着修改,并增加一种新的inteface, EProductNiubility,下面有各大厂商的实现,苹果的取名iWatch,三星的取名iSee
以品牌为导向的:增加SuperFactory的一种实现—— NiubilityFactory,除此之外,无需修改任何既有类,所有操作都是扩展
我们对系统的修改要讲究开闭原则,即对扩展开放,对修改关闭;因此,对于乔布斯有可能醒来这种业务场景,你需要选择后者这种以品牌为导向的抽象工厂,因为它的修改最少,然而乔布斯不可能醒过来,再崛起一家像苹果三星一样的品牌也不容易,我们在设计抽象工厂一定要具体问题具体分析,选择最合适你的业务场景的抽象工厂
如果是在一年前,作者是不可能理解抽象工厂的博大精深的,但为什么网上随便搜了一篇文章后能快速理解呢,这主要是因为这一年搬了不少砖,特别处理重复度比较高的业务,因此对于设计模式这种专业级代码精简美化的手法有种莫名的渴望,而刚参加工作时并没有多少开发经验,设计模式看了一遍又一遍,除了几个比较小白一点的设计模式(单例模式),皆如对牛弹琴,因此如果你也像作者这样,也可以照着23种常用设计模式去review一下过去一年设计过的系统,相信会有新的发现