工厂模式

Posted panning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。

一、模式解决的问题

  工厂模式是创建型模式(创建一个对象用个New不就完事了吗,为什么要用工厂模式来创建?把复杂对象的创建过程暴露给使用者不好,就好比你要看电视,难不成还要知道电视机内部的原理、电视机是如何制造出来的吗?),OK,那么我们就要一个专门的工厂用来生产我们需要的东西,这就是工厂模式的用武之地,说的简单点,工厂模式就是用来解决对象创建的。

二、解决方法

  最简单的,我搞一个工厂,这个工厂名字叫“XXX上帝工厂”(因为它可以生产所有东西,比机器猫的口袋还要灵!有些书中叫这个类为上帝类),我们用到的所有东西都由这个对象来创建。这个就是简单工厂模式(Simple Factory method),由一个类负责创建所有对象。

  嗯,不错,简单粗暴,在仔细一想,不对,所有的对象都要由它来创建,或者说它负责创建所有的对象,那以后每多一个新的对象,就得在这里面改,你改,我改,他改,哪天TMD哪个贱人一不小心把我的创建对象逻辑改坏了,我TM怎么查!!!从代码维护性、分工上来说,这不是一个好方案,嗯,从分工上这个不是好方案!这就是原始社会小作坊的模式,你一个人得要懂所有东西才能生活下去,老子没那么多时间学所有的东西!!!

  那好,本着专业的人做专业的事,那我们来分工,我们定义几个创建对象的方法,制定一个抽象工厂接口,好的,你们要开厂建东西可以,得要按照我的接口定义来,且每个工厂只能负责生产自己的东西,蒙牛厂只能用来生产牛奶(别TM生产三聚氰胺而且还死不承认,我艹你妈),蔬菜厂只能生产蔬菜。好了,这样的话每个人只要负责创建自己熟悉的对象,要新增对象,也不会影响到其他人。这个就是工厂模式(Factory method),专门人干专门的活,分工明确,出了事责任明确,谁也别想甩锅。

  这样搞了好久,井井有条,貌似很好,可是突然有一天,工商局来电话了,“我叼你大爷的,老子现在每天7*24小时的负责注册公司,老子过劳死了!!!”,“喂喂喂”,“.... ....”,“喂喂喂喂”,“... ...”,好吧,估计真的过劳死了(总算搞死了这个龟孙子,替天行道,欧耶)。不过仔细想想,我也是满不厚道的,如果用工厂模式,那么工厂数量会无限爆炸,来一个对象搞一个工厂,那还了得,今后老子怎么管他们,怎么管得过来,此时张学友的吻别响起“我已经看见,一出悲剧正上演”。

  艹,给对象归类,工厂模式之所以可能成为悲剧,表面上看起来是因为工厂太多,实际上是因为我们对象没有进行整合,什么叫对象整合呢,看下面例子:

蒙牛工厂按照市场部的要求,要求生产高、中、低端牛奶(里面加三聚氰胺的量不同),高端:特仑苏,中端:酸酸乳,低端:100%三聚氰胺(俗称吃死你)。

工厂模式的做法是成立三家分公司,蒙牛特仑苏分公司生产特仑苏,蒙牛酸酸乳分公司生产酸酸乳,蒙牛三聚氰胺分公司用来专门生产梦牛排三聚氰胺。

什么!!!!!这TM根本就是在凑数,明明一家公司(蒙牛,产品族),就是多了几个系列(产品系列)而已,凭什么要搞的那么复杂,今后要清算你这鸟人也不好搞。

  好,那就按照产品族,产品系列来进行划分,一个工厂负责生产三种规格的商品(蒙牛工厂有3个分别生产高中低端牛奶的方法),这样就一个类搞定。嗯,这就是抽象工厂模式,和工厂模式的主要区别在于,它将产品按照产品类别、产品族进行划分,这样能够解决工厂模式工厂类爆炸的情况。代码自己网上去找吧。对了,这个可以叫做流水线模式,把一个最终品分解成多个子对象。

 

以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

工厂模式抽象工厂模式策略模式

JAVA设计模式——工厂模式简单工厂模式工厂方法模式抽象工厂模式

C++实现工厂模式(简单工厂模式工厂方法模式抽象工厂模式)

设计模式之工厂模式详解和应用

iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

设计模式——抽象工厂模式