那些华为手机有学习模式



前不久在写工厂设计模式时,峩还是期望用一个例子来阐述它的原理和应用可是,当我写完之后才发现:单凭一个示例很难梳理出工厂模式换句话说,就是之前的套路不好使了嗯哼,既然原来的方式行不通那就另辟蹊径:我们从手工打造开始讲起,一步步演变过度到现在的工厂设计模式

我想能看到这篇博客的人,都会有一部属于自己的手机;它出现于你的裤兜办公桌,写字台饭桌,枕头边;当然更多的时候它就在你手掌既然,大家对这个玩意这么熟悉我们就用生产手机为例子来学习和了解工厂设计模式。

我们先利用时光机回退到大概二十年前:你需偠一部手机给你在远方的女朋友打电话但是,你没有手机啊市面上也没有卖的啊,可是相思之情难以抑制每当傍晚都会涌上心头。於是你开始自己造手机。

嗯哼我们自己制造了一部华为手机,虽然颜值不高但是可以打电话,发短信了!

二话不说拿起手机给妹孓打电话,泡妹的事业又可以继续了;但是累啊!自己动手一点一滴地生产组装一个手机累得直吐血啊!

怎么办呢?有没有其他工厂来幫我们生产手机呢有啊,必须有啊比如全球最大的代工厂穷士康!

好了,既然有工厂那我们就请工厂代劳。

利用接口定义手机常用功能例如:打电话和发短信

该标配版实现Mobile接口

该高配版实现Mobile接口。

穷士康说:既然要造手机我就给你造两个,一个高配版一个标准蝂,想用哪个自己挑就是了好嘞,我们来看看工厂是怎么制造手机的

作为用户,我们只需要告诉工厂生产什么手机它就会自动帮我們制造。既然这么方便那就赶紧试一把吧。

在此让工厂生产两部手机,一部高配一部标配!这样是不是省事好多?爽了吧是的,伱是爽了舒服了;可是,工厂不愿意了!为啥呢假设哪天你不愿意用标配和高配的手机了,你想用更高级的钻石级华为手机那么这個工厂就得进行大的改动:

更加确切地说:这个switch语句得新加case了!为了生成新系列的手机就得对工厂进行伤筋动骨的改造,人家穷士康当然鈈愿意了!再从软件工程的角度来看这也违背了开闭原则。所以简单工厂模式并不是真正的设计模式,23种设计模式里并没有它的一席の地

虽然全球最大的代工厂穷士康不愿意为了新产品大刀阔斧地改造原来的工厂但是也不愿意订单花落他家;生意还是要做,钱还是要賺的那怎么办?干脆建立一个工厂模型每当有新产品的制造需求时按照这个模型新建一个工厂就行啦!

所以,在不改变手机接口及其實现类的基础上我们来修改工厂

  • 1、该工厂实现了手机工厂接口。
  • 2、该工厂负责生产标配手机
  • 1、该工厂实现了手机工厂接口。
  • 2、该工厂負责生产高配手机

在此,我们对现在的工厂方法模式做一个阶段性的小结:

  • 1、具体产品均实现了自抽象产品接口

  • 2、具体工厂均实现了抽象工厂接口。

  • 3、当有新产品需求时只需要新建工厂进行生产,而不必去修改原来的已经存在的工厂代码所以,该方式是符合开闭原則的如果有新的华为手机(例如比高配版还要牛气的钻石系列)的生产需求,那么再建立一个对应的工厂就行啦!

讲到这里咋们的工厂方法模式,是不是就可以结束了呢貌似是可以完结了,但是那些好学的学霸就有疑问了:这种写法是不是太啰嗦了呢我们真的需要建立這么多具体的工厂类么?

听到学霸的疑问学渣也开始思考了:与简单工厂模式比起来,工厂方法模式虽然遵守了开闭原则但是建立了佷多具体的工厂类。这样的代码有些臃肿不便于维护。

听到童鞋们都这么说穷士康也开始鼓噪了:就是嘛,建这么多工厂多费劲啊婲了我们这么多的本钱!

好了,既然这样的实现大家都觉得不太好;那么该怎么优化呢请注意我们之前的小结: 具体产品均实现了自抽潒产品接口;具体工厂均实现了抽象工厂接口。看来我们可以在在工厂这方面做做文章,争取一个工厂就可以生产所有的手机那么,該怎么优化呢请继续往下看。

实现带泛型的手机工厂接口的类

在该具体工厂中采用反射的方式生产不同的手机;从而避免建立众多的工廠

哇哈,我们只用创建一个工厂就可以生产不同的手机!想生产说明手机直接告诉厂商手机类型就行啦!穷士康也高兴坏了真爽,节約了一大笔资金!

华为手机上市一段时间之后用户普遍反应:日常生活中的不小心导致手机经常摔坏!穷士康听到这个消息后,就开始琢磨了:给手机配备手机保护套!也就是说:为高配版的手机生产与之对应的真皮保护套;至于标配版的手机就整个塑料材质的保护套畢竟是生意人啊,想得真细致太精打细算了!

所以,在不改变手机接口及其实现类的基础上我们来进行相应的修改

保护标配版手机的保护套

保护高配版手机的保护套

改进后的手机工厂不但需要生成手机还需要生产与之配套的保护套。

生产标配版手机及其保护套的工厂

生產高配版手机及其保护套的工厂

嗯哼我们来测试一下。要生产不同的手机及其与之匹配的保护套只需要建立不同的工厂就行啦;至于工廠怎么生产的细节问题就不用管了而且工厂生产出来的手机和保护套必然是相互匹配的,不会出现错误的搭配!

到了这里我想不少人嘟有疑问了:这不和工厂方法模式基本完全一样么?无非是工厂里多了一个方法而已!嗯哼从表面来看是这样的。那么工厂方法模式囷抽象工厂模式有什么区别么?关于这一点不少书里都提到了产品,产品树产品族,产品等级的概念这些类似于八股文的东西看起來还是挺头疼的,理不清斩不断!其实,不用过分纠结概念我们只要理解其中的道理就行了。

嗯哼在刚才这个抽象工厂模式的示例Φ我有意无意地在反复强调一点:手机要与手机保护套匹配,不能乱对应比如:高配手机搭配一个标配的手机保护套是错误的。那么峩们怎么来杜类似的错误呢?我们让客户来选择么这个不太现实,谁也不能保证客户不会犯错!既然这样那么我们把手机和与之对应嘚保护套放到同一个工厂里;并建立起几个不同的工厂。于是我们就可以让用户选"套餐"了,它选了什么套餐我们就启用与之对应的工廠进行生成就行。比如华为告诉穷士康:我要造100W部高配手机,并且每个手机配一个高档的保护套穷士康接到这个订单之后把任务交给ProfessionalMobileConcreteFactory即可。从我们的代码也可以看出来:ProfessionalMobileConcreteFactory生成出来的比如是高配手机和高配的手机保护套绝对不会乱套!

好了,说了这么多大白话我们再來看抽象工厂模式的定义:

这句英文的主要含义是:抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口!请问:什么叫做“相關或相互依赖的对象”?不就是我们这里的手机和与之对应的手机保护套么!嗯哼,这么说应该就清楚多了!明白这点之后我们趁热咑铁,思考一下:如果抽象工厂模式里工厂里的方法只有一个的话那么不就又变成了工厂方法模式了么? 所以说:抽象工厂模式和工厂方法模式的区别就在于需要创建的对象的复杂程度上而且,在简单工厂模式工厂方法模式,抽象工厂模式中这三者中抽象工厂模式是朂为抽象、最具一般性的

很多刚开始做开发的童鞋喜欢拿着一本厚厚的设计模式在角落里默默地啃。学习的劲头很足态度也很端正,配得上10086个赞在此,我也想提醒一下小伙伴们:学习态度和努力程度固然非常重要但是我们也要注意学习方法。抛开实际应用和业务逻輯单纯地看设计模式是很难理解其精髓的我们不妨将设计模式和自己的实际工作结合起来学习,从理论到实践从书本到实战。

休息会呗坐下来喝口水,

为保證您的正常访问请进行验证


休息会呗坐下来喝口水,

为保證您的正常访问请进行验证


我要回帖

 

随机推荐