最近在看设计模式,故事好玩是好玩,可是代码也很多啊,有时候看图不太理解,为了让自己有兴趣并且坚持下去,在第一遍宏观的看了一遍之后,把23种设计模式进行了一下分类,然后再找类似的模式一起学习,通过对比学习再理解,确实是容易了一些。先学的创建型模式里的工厂三姐妹,一块学习这三个模式,比较一下它们的优缺点,知道什么时候要用什么模式。
一、概念介绍
1、简单工厂:Simple Factory,是由一个工厂对象决定创建出哪一种产品类的实例,是工厂模式家族中最简单实用的模式。
个人理解:将界面与业务逻辑分离,分离出一个类专门来创建实例的过程。
2、工厂方法:Factory Method,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
个人理解:为了遵循扩展开放,修改关闭原则,将简单工厂类转换为工厂方法接口,将其Switch分支分离成子类去继承工厂方法接口类,顺利的将创建对象的过程延迟到子类。
3、抽象工厂:Abstract Factory,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
个人理解:工厂方法模式的转变,增加工厂方法接口的方法就重构出了抽象工厂。
二、实例讲解(以访问DB为例)
1、Simple Factory
创建一个简单工厂,用来创建实例化User类和Department类。在客户端代码中直接得到数据库访问实例即可,不依赖与Sqlserver与Access数据库。
客户端代码:
static void Main(string [] args) { User user = new User(); Department department = new department(); IUser su=DataAccess.CreateUser (); su.Insert(user); su.GetUser(1); IDepartment ide = DataAccess.CreateDepartment(); ide.Insert(department); ide.GetDepartment(343); Console.Read(); }
2、Factory Method
需要用到3个工厂,达到了业务逻辑与数据访问分离,客户端代码在运行时不需要知道在访问哪个数据库。
客户端代码:
static void Main(string [] args) { User user = new User(); Ifactory factory=new AccessFactory(); IUser su=factory.CreateUser (); su.Insert(user); su.GetUser(1); Console.Read(); }
3、Abstract Factory
增加了访问的数据库中的表,只需增加相应的类以及接口,在Ifactory接口中增加相对应的创建对象的方法即可。
客户端代码(与工厂方法类似):
static void Main(string [] args) { User user = new User(); Department department = new Department(); Ifactory factory=new AccessFactory();//确定实例化哪一个数据库访问对象给factory IUser su=factory.CreateUser ();//与具体的数据库解除了依赖 su.Insert(user); su.GetUser(1); IDepartment ide = factory.CreateDepartment(); ide.Insert(department); ide.GetDepartment(343); Console.Read(); }
三、比较
1、简单工厂VS工厂方法
相同点:都达到了业务逻辑与访问数据的分离。
不同点:
(1)简单工厂:对象的实例化在工厂中,需要用Switch进行条件选择,违背了修改关闭的原则,但是对于客户端来说,去除了对具体产品的依赖。
(2)工厂方法:将实例化的过程延迟到子类,工厂方法将内部逻辑判断转移到了客户端中,只需要修改客户端即可。遵循了开放——封闭原则。
2、抽象工厂优点VS缺点
优点:改变一个产品系列时,只需改变具体的工厂即可,没有其他的变动,与具体产品无关。遵循了开放——封闭原与依赖倒转原则。
缺点:如果增加一个功能,就要增加相应的类,接口,还要改变Ifactory工厂,SqlserverFactory以及AccessFactory三个工厂类。
四、感受
刚开始的时候觉得有些地方还是有点不太理解,等到总结要画图的时候突然就明白了一些,看来还是画图的作用大啊,往下学设计模式的时候要边画图边敲代码,这样理解会好一些的。
不足之处:对这三个模式的学习时间长了一些,丢了宏观。接下来要好好调整一下战略。