从“抽象工厂方法”总结三大工厂模式

     As weall known,物理学中的“绝对零度”是实现不了的,“绝对光滑”也是实现不了的,回头看三大工厂,尽管一直在不断优化,“开放-封闭”原则也是不能绝对实现的。

                                                      ----题记

    首先对于“抽象工厂模式”进行简单的分析,我认为要学会“抽象工厂”,“工厂方法模式”的理解是前提,就拿“IUser表”举例子,因为“工厂方法模式”已经对具体的数据库比如Access和Sql Server创建了具体工厂,“抽象工厂”即在“工厂方法”的基础上增加了需要访问的数据表,在代码的体现上,在具体的工厂中增加相应需要实例化的对象的方法即OK,这特别像我们英语学习上学完了音标再学Paul叔的材料一样,i+1的原则,具体的“抽象工厂模式”就不多介绍了,因为它就是“工厂方法”的i+1。

    就像我看过超越姐所写的一篇博客关于“如何举办英语活动”一样,针对不同的情况,需要考虑(1)、可能时间点掐的比较好,原准备的会议内容都能说完,也有可能现场控制不好,导致内容讲不完;(2)、同时还要考虑因为时间过长而导致学生精力不集中和因为时间短而效果不好的问题。如何解决就开会需要考虑的时间长度、会议的效率的这个问题,就可以套用“抽象工厂模式”的思想,解决办法即在拟定方案的时候拟定两套方案,即方案A和方案B,相当于如图,通过一个生活的例子,就会深深的将其印在脑子中。

                                                

下面简单的类比一下三大工厂模式:

   1、从简单工厂、工厂方法到抽象工厂,三种模式面对的具体的问题在可复用、可扩展、灵活性的要求上越来越高,即这三种模式所面对的问题是耦合性逐渐增强的。简单工厂解决一些本来客户端需要去做判断的问题,将具体的算法封装到工厂类之后就可以解决这个问题了;工厂方法即开始具体问题具体工厂分析面对,针对性更强了,而抽象工厂更是在工厂方法的基础上,去解决强耦合的问题。So,杀鸡不用宰牛刀,遇到具体问题具体分析,选择何种模式除了自己的熟练程度之外,还要考虑哪个更适合。

   2、三大工厂之间的关系:

  (1)工厂类之中都写些什么?

    Firstly,在脑子中去想这三个工厂的类图,分别想出来之后去想三个工厂中的代码,如果想不出来说明对代码的亲和力还不够,自己回头要多敲代码哦!!~然后你会惊奇的发现三者的代码竟然有异曲同工之妙,如下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Oper=newOperationAdd(); //简单工厂例子OperationFactory中代码

   Return newOperationAdd(); //工厂方法AddFactory中代码

   Return new SqlserverUser(); //抽象工厂SqlServerFactory中代码

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    So,工厂是用来干什么的我想你该猜到了,对,调用构造函数,即实例化对下那个,其实就是解耦,虽然简单工厂是在case语句中进行,工厂方法和抽象工厂是在具体工厂中实例化,但万变不离其宗。一直在想着自己敲代码的我,初次接触它的时候晕头转向,但是分析分析之后,就能找到突破口了。

 

  (2)共同点在哪里?

    一、中心思想高度一致,设计理念如出一辙。

    界面和逻辑代码分离、就像简单工厂和工厂方法,从具体的算法类抽象出算法Operation的抽象类,这是不变的,也是解决问题的第一步。在这一点的基础上,去构建工厂、接口等等~~~

最终通过引入工厂实现解耦和的根本目的。

    二、 如上所示,工厂的作用都是一样的。

  (3)不同点又是什么?

    在简单工厂模式中,OperationFactory是一个就是一个普普通通的实体类,没有用到抽象也没有用到接口,在工厂方法和抽象工厂中则是用到了Interface接口,然后具体的工厂类去实现这个接口。这就不得不提抽象类和接口的区别了,水比较深,不提了。这一点区别了解了,再自己设计程序的时候就不容易犯错了。

  (4)关系汇总.

    如图所示,这是我对三个模式之间关系的总结:

                                                                                                    

                                                                                             

    无论是工厂方法也好,还是抽象工厂也罢,这两种模式都是可以用简单工厂来实现的,关于这一点的代码值得尝试。

    其次,抽象工厂是对工厂方法的扩展,但是这二者有一个缺点值得注意,如果像例子中那样除了IUser表、IDepartment表,还有至少10张表的时候,Return new SqlserverUser();这样的类就要实例化10多次,不好,如何改进呢????

                

   最后,简单工厂+反射技术也很值得一提,是对简单工厂中case语句的一个改进,同时也是对抽象工厂的一个优化。反射的技术,也是通过这个模式才有所了解的。

 

    Finally,说一下关于对三个工厂在“开放-封闭”中的体现。

    就像题记中所说的,开放封闭原则只能无限的趋于完美,但是不能实现完美,简单工厂中,如果算法有变化or增加新算法,必须修改或增加CASE语句,对“修改”开放了,不好;在工厂方法模式中,无论是修改旧的算法类,还是新增新的算法,基本上满足“开闭原则”,不过如果增加新算法过多的话,同时添加的具体工厂类也会很多,同时这个模式也让客户端得去认识具体的算法类,总体来说还不错;而抽象工厂类,我个人的理解,该模式中工厂的职能要比“工厂方法”中工厂的职能强很多,它可以被多个具体类所引用,就“开闭原则”而言,增加新的数据表的时候,需要在原有工厂中新增方法,某种意义上这也是对“修改”开放了,总而言之,处理的问题复杂了,难免会对“修改”开放,一味的追求六大原则,也未必是件好事。


评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值