将计算机思维故事化——之设计模式简单工厂、工厂模式及抽象工厂

写代码,在某种程度上有点像“织毛衣”。需要堆积一定时间去完成,同时还是个心思活,也需要构思、设计、技巧。

织毛衣,有很多花纹设计、针织布局和设计技巧,例如,织胸前、织袖口、织口袋等都是不同的技巧和设计。当然,这些经验性的东西都是人们长期劳动总结积累的结果。写代码也是一样,那些被反复使用、且大家认可的设计经验和总结,被称为“设计模式”。

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。一般讲述的设计模式一共有23种,在不同情况的需求下,使用不同的设计模式】

 

在这篇文章里,我们只提23种中3种,它们是:简单工厂模式工厂模式抽象工厂模式

为了描述这3种设计模式,我们引入一个科幻的场景——老农种水果

老农得到一块神奇土地,这块土地能够听懂老农说的话,并且在一瞬间从无到有,产出成熟的水果。

 

第一年,老农是非常乐意的,可以到这块神奇土地来不劳而获,只需要对土地说“产香蕉”或者“产苹果”,神奇土地就硕果累累,老农便可满载而归。不要小看“产苹果”这三个字,它里面包含了两层意思:第一,该生产了;第二,该产的是苹果。

这种方式的特点是:第一,多种水果产生在一块土地上;第二,生产的时候,需要告诉土地生产什么水果;第三,当老农需要第三种水果(例如:西瓜)时,需要提前让土地记住什么是“西瓜”,影响整块土地对前两种水果(香蕉和苹果)的记忆。

【这种设计模式被称为“简单工厂”。该设计模式的特点是:第一,在一个模块内可以创建多种实例;第二,实例在创建之前要通过传入的参数进行逻辑判断;第三,对于新增加一个产品,需要对模块内部的逻辑判断重新拓展一遍。】

 

第二年,老农用了新的办法。将这块神奇土地分成若干块,其中一块专门生产苹果,一块专门生产香蕉。这样,老农比第一年说的话还少。当他需要香蕉时,就走到专门生产香蕉的那块区域,说一声“产”,土地同样也是硕果累累,老农同样也是满载而归。当然,当老农需要苹果时,走到专门生产苹果的那块区域,同理罢了。

这种方式的特点是:第一,老农走到哪一块区域,决定着他得到什么水果,而不是他说什么就得到什么;第二,老农说的话是一样的,只是走到不同区域去说而已;第三,当老农需要第三种水果(例如:西瓜)时,同样可以划出另一块区域专门生产西瓜,不对前两种水果产生产生影响。

【这种设计模式被称为“工厂模式”。该模式的特点是:第一,具体的创建实例操作在具体划分的子类中执行;第二,拓展性好,不会对已有模块产生影响。】

 

第三年,老农的方法又有了新的改变。这次改变,使得他可以在生产同一种水果时,可以生产出不同档次的——优质水果和一般水果。老农把土地整理了一番,分成上下两层,因为上面一层受光照更好,所以产出的水果为优质水果,下一层则为一般水果。

这样,老农把控土地的能力更加增强了。不但可以决定要什么,还可以决定要什么档次。所以,每次老农需要水果时,第一个思考的问题就是“要优质还是要一般”。假如,要一般的香蕉,老农需要做的是:先到土地的下一层,再走到专门生产香蕉的区域,最后说一句“产”。

这种方式最大的特点就是:能够生产出不同档次的水果。而带来的弊端是:拓展性没有第二年的方法好了,因为要第三种水果(例如:西瓜)的话,需要在上下两层都去重新划分区域来专门生产第三种水果。

当然,好在老农需求的档次只是2个档次,若是水果档次分为“精品”、“优质”、“较好”、“一般”、“勉强”、“劣质”……甚至几十个档次,那么拓展就更麻烦了。

【这种设计模式被称为“抽象工厂模式”,这种设计模式是应对产品族概念而生的,一般用于有产品族的情况下,但拓展性不好。】

 

其实,不同的三种方法,使得老农需要水果时第一时间思考的问题是不同的。第一年,老农最先思考的是,“说什么话”;第二年,老农最先思考的是,“去哪块区域”;第三年,老农最先思考的是,“要什么档次”。




* 思维碰撞,不要忘了与好友分享!未来将推出“将计算机思维故事化”系列,谢谢大家的关注!*

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值