【设计模式】抽象工厂模式

对课本的总结,首先回顾一下课本上抽象工厂模式例子的发展过程如下三个阶段

阶段一、只有user和sqlserveruser。

阶段二、把Sqlserveruser抽象为接口IUser,可以便于扩展,在这里扩展出一个AcessUser; 
     为了让接口IUser去和user发生关系,解除了user和具体数据库的耦合,增加了一个访问User对象的抽象工厂接口:IFactory.
这里是工厂方法


阶段三、实际情况不可能仅仅有一个User表,还有很多,比如增加一个Department表。那么如上 User表,需要增加一个IDepartment,及SqlserverDepartment和AccessDepartment。以及修改IFactory、SqlserverFactory、AccessFactory的方法,增加一个方法:CreatDepartment()。

这是抽象工厂模式。



抽象工厂模式是提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。
(上述例子中IFactory就是User和Department等一系列表的接口。)
优点
1、易于交换产品系列;
2、具体创建实例过程与客户端分离,客户端通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端,使得客户端简单。
(例子中1、便于把一系列表如:User、Department等,由Sqlserver替换到Access;
        2、实例化Sqlserveruser或AcessUser等通过IFactory的CreateUser()实现,使得客户端不会出现具体的产品名。)

缺点:增加一个产品时,程序需要修改三处。

原则:开封原则和依赖倒转原则。

为了避免上述缺点,小菜用简单工厂,把上述中的IFactory、SqlFactory、AccessFactory舍弃,改为DataAccess.如下图:


优点:同样达到了解耦的目的,而且减少了类,使得修改起来更加的艺术。
缺点:若再增加一个数据库的话,需要修改代码,在每个switch下增加相应代码,而抽象工厂就比较简单,直接扩展一个数据库工厂即可。

运用反射技术,可以避免上述switch或if的问题,更加的优秀!

那么什么是反射技术呢?
    大家还是看百科吧!我还有待进一步学习。

反射技术不明白,别不代表不会用。只要会套用格式就行,格式如下
Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")

优点:用反射可以简化工厂代码的复杂程度。

感受:这个设计模式我学习了三个多小时,但学习效果还是可以的,就是时间有点长,要慢慢提高学习效率。另外,在学习的这个模式过程中,碰见复杂点的知识,我就想着放弃,但立马我就对自己说只要看进去就可以看懂。结果证明我需要这样的心理暗示,这样的心理暗示可以让我集中精神。
    我们学习过程中,应该都会有各种不同的情况,但遇到不好的情况时,不防给自己积极的心理暗示,效果不错。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章