一、模式解决的问题
工厂模式是创建型模式(创建一个对象用个new不就完事了吗,为什么要用工厂模式来创建?把复杂对象的创建过程暴露给使用者不好,就好比你要看电视,难不成还要知道电视机内部的原理、电视机是如何制造出来的吗?),OK,那么我们就要一个专门的工厂用来生产我们需要的东西,这就是工厂模式的用武之地,说的简单点,工厂模式就是用来解决对象创建的。
二、解决方法
最简单的,我搞一个工厂,这个工厂名字叫“XXX上帝工厂”(因为它可以生产所有东西,比机器猫的口袋还要灵!所以有些书中叫这个类为上帝类),我们用到的所有东西都由这个对象来创建。这个就是简单工厂模式(Simple Factory method),由一个类负责创建所有对象。
嗯,不错,简单粗暴,我喜欢,在仔细一想,不对,所有的对象都要由它来创建,或者说它负责创建所有的对象,那以后每多一个新的对象,就得在这里面改,你改,我改,他改,哪天TMD哪个贱人一不小心把我的创建对象逻辑改坏了,我TM怎么查!!!从代码维护性、分工上来说,这不是一个好方案,嗯,从分工上这个不是好方案!这是原始社会小作坊的模式,你一个人得要懂所有东西才能生活下去,老子没那么多时间学所有的东西!!!
那好,本着专业的人做专业的事,那我们来分工,我们定义几个创建对象的方法,制定一个抽象工厂接口,好的,你们要开厂建东西可以,得要按照我的接口定义来,且每个工厂只能负责生产自己的东西,蒙牛工厂只负责生产牛奶(别TM生产三聚氰胺而且还死不承认,我艹你妈),蔬菜工厂只负责生产蔬菜,水果工厂只负责生产水果。好了,这样的话每个人只负责创建自己熟悉的对象,要新增对象,也不会影响到其他人。这个就是工厂模式(Factory method),专门人干专门的活,分工明确,出了事责任明确,谁也别想甩锅(要甩锅只能甩给临时工了)。
这样搞了好久,井井有条,貌似很好,可是突然有一天,工商局来电话了,“我叼你大爷的,老子现在每天7*24小时的负责注册公司,老子过劳死了!!!”,“喂喂喂”,“.... ....”,“喂喂喂喂”,“... ...”,好吧,估计真的过劳死了(总算搞死了这个龟孙子,替天行道,欧耶)。不过仔细想想,我也是满不厚道的,如果用工厂模式,那么工厂数量会无限爆炸(因为一个工厂只负责创建一个对象,来多少对象,就得搞多少对应的工厂),那还了得,今后老子怎么管他们,怎么管得过来,此时张学友的吻别响起“我已经看见,一出悲剧正上演”......
艹,给对象归类,工厂模式之所以可能成为悲剧,表面上看起来是因为工厂太多,实际上是因为我们对象没有进行整合,什么叫对象整合呢,看下面例子:
蒙牛工厂按照市场部的要求,要求生产高、中、低端牛奶(里面加三聚氰胺的量不同),高端:特仑苏,中端:酸酸乳,低端:100%三聚氰胺(俗称吃死你)。
工厂模式的做法是成立三家分公司,蒙牛特仑苏分公司专门负责生产特仑苏,蒙牛酸酸乳分公司专门负责生产酸酸乳,蒙牛三聚氰胺分公司专门负责生产蒙牛牌三聚氰胺。什么!!!!!这TM根本就是在凑数,明明一家公司(蒙牛,产品系列),就是多了几个系列(产品族)而已,凭什么要搞的那么复杂,今后要清算你这鸟人也不好搞。
好,那就按照产品族,产品系列来进行划分,一个工厂负责生产三种规格的商品(蒙牛工厂有3个分别生产高中低端牛奶的方法),这样就一个类搞定。嗯,这就是抽象工厂模式,和工厂模式的主要区别在于,它将产品按照产品类别、产品族进行划分,这样能够解决工厂模式工厂类爆炸的情况。代码自己网上去找吧。对了,这个可以叫做流水线模式,把一个最终品分解成多个子对象。
贴个抽象工厂模式的UML图: