苹果最近的日子不好过啊,手机没啥创新的东西出来,倒学起了当年诺基亚最拿手的换壳,换尺寸的套路了,Mac的销量也大幅下滑,虽说这种巨头公司不至于轰然倒下(我说的不是诺基亚),但是颓势渐显,我心中也不免有些酸楚。或许苹果并不缺乏惊喜,只是缺了那句动人的“one more thing”。

回到正题,说到苹果又提到工厂,大家肯定会联想到富士康,不过今天说的工厂不是富士康,它是一种设计模式,但是毕竟代码虽然高于生活,但是也是来源于生活,所以今天说的工厂和富士康也有关系。

工厂模式顾名思义,工厂嘛,自然是要生产产品的,外面卖的iPhone都是工厂生产出来的,iPhone本身是抽象的,因为实际生活中卖的是iPhone4,iPhone5,iPhone6这些,所以iPhone从程序角度来讲就是一个接口,声明了一些能力,我们精简一下,保留call和answer,iPhone1/2/3/4/5/6实现了iPhone的接口:

interface iPhone{  call();  answer();}class iPhone1/2/3/4/4/6 implements iPhone{  call(){...}  answer(){...}}

为了便于生产,苹果封装了一个生产iPhone的工厂(简单工厂)

class iPhoneFactory{  iPhone makeiPhone(code)  {  code==1 then return iPhone1;                              ...  code==6s then return iPhone6s;  }}

这套方法被苹果封装起来了,富士康改不了(就像我们拿到了别人的sdk一样,如果不用黑科技,我们也没法改别人封装好的东西)。富士康只能按照需要塞个code到苹果封装的工厂里,生产出对应代的iPhone,整个过程机械单一,但效率很高,富士康的工人也不需要关心iPhone是怎么造出来的,只需要按照规定操作就可以了。

但人都是好奇的,工人们发现只要塞个code进去就能出来相应的iPhone,那塞个7进去是不是就可以出来iPhone7了,不过很很可惜,机器运转了一下,发现code那里没有匹配7的,于是返回一个null。为了防止工人们乱试,苹果改造了一下自己的工厂:

class iPhoneFactory{  iPhone makeiPhone1() return iPhone1;                        ...  iPhone makeiPhone6s() return iPhone6s;}

这下不用传code了,给了啥生产方法就用啥生产方法,把好奇心彻底灭掉。

如果真的需要生成iPhone7了呢,很简单,只需要在iPhoneFactory里增加一项makeiPhone7就好了。

不过看过之前那篇关于设计模式的原则的文章的同学可能会注意到,这里其实违背了设计模式的开闭原则,即对扩展开放,对修改封闭。为了生产iPhone7,则需要修改已有的iPhoneFactory的代码,如果这是一个给出去的sdk,就意味着要扩展类似的生产功能,需要重新向所有sdk的使用者发布新的sdk。嗯,想想不太方便,不如我们试着帮苹果改善一下,为了扩展方便且尽量不改动已发布的代码,我们把工厂也抽象了(抽象工厂):

abstract class iPhoneFactory{  abstract iPhone makeiPhone();}

且为每个iPhone都创建一个工厂

class iPhone1Factory extends iPhoneFactory{  iPhone makeiPhone() return iPhone1;}...class iPhone6sFactory extends iPhoneFactory{  iPhone makeiPhone() return iPhone6s;}

嗯,看起来怎么比刚才麻烦了呢,不过你再仔细想想,如果要生产iPhone7是不是就不用修改之前的任何代码了呢,只需要新创建一个

class iPhone7Factory extends iPhoneFactory{  iPhone makeiPhone() return iPhone7;}

苹果也不需要重新向sdk的使用者重新发布,ok,看起来完美!

为啥说看起来呢,因为如果我们真这么做了,乔帮主估计要气醒过来。富士康拿到这个工厂方案也乐了,嘿,这哥们真够意思,这么多年了只是自己玩,如今扩展性做的这么好,不如我们大富士康厂来做自己的iPhone吧,不是iPhone7还没出来吗,没关系,现在不需要苹果你提供iPhone7的方法了,我们自己先建个厂

class iPhone7Factory extends iPhoneFactory{  iPhone makeiPhone() return  FuShiKangDeiPhone7;}

然后

iPhone7Factory.makeiPhone()

,开产!

当然这里是个笑话,苹果玩的就是封闭,当然不会这么干。(我都没给iPhone7的生产方法,你还想产iPhone7?做梦吧)。不过如果我们抱着开放的心态,明显抽象工厂的扩展性更好。

苹果的生产线可不止iPhone,还有iPad,iWatch…

所以为了适应许许多多的产品线,苹果公司还需要将工厂改造一下(抽象工厂模式)

abstract class AppleFactory{  abstract iPhone makeiPhone();  abstract iPad makeiPad();  abstract iWatch makeiWatch();}

这下可以为不同的国家制定不同的生产策略了,比如中国的消费力强劲,就多开些

class DearAppleFactory extends AppleFactory{  iPhone makeiPhone() return iPhone6s plus;  iPad makeiPad() return iPad Pro2;  iWatch makeiWatch() return iWatch2;}

印度人也多,就是没中国人这么有钱,那就开这样的厂呗

class CheapAppleFactory extends AppleFactory{  iPhone makeiPhone() return second hand iPhone6;  iPad makeiPad() return iPad mini;  iWatch makeiWatch() return null;}

好了,今天苹果开厂的故事就讲到这里了。

本文来自给产品经理讲技术(微信公众号:pm_teacher)授权发表,转载请联系原作者,违者必究。