天天看点

【大话设计模式】——工厂三姐妹一、概念介绍二、实例讲解(以访问DB为例)三、比较四、感受

    最近在看设计模式,故事好玩是好玩,可是代码也很多啊,有时候看图不太理解,为了让自己有兴趣并且坚持下去,在第一遍宏观的看了一遍之后,把23种设计模式进行了一下分类,然后再找类似的模式一起学习,通过对比学习再理解,确实是容易了一些。先学的创建型模式里的工厂三姐妹,一块学习这三个模式,比较一下它们的优缺点,知道什么时候要用什么模式。

一、概念介绍

1、简单工厂:Simple Factory,是由一个工厂对象决定创建出哪一种产品类的实例,是工厂模式家族中最简单实用的模式。

个人理解:将界面与业务逻辑分离,分离出一个类专门来创建实例的过程。

2、工厂方法:Factory Method,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

个人理解:为了遵循扩展开放,修改关闭原则,将简单工厂类转换为工厂方法接口,将其Switch分支分离成子类去继承工厂方法接口类,顺利的将创建对象的过程延迟到子类。

3、抽象工厂:Abstract Factory,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

个人理解:工厂方法模式的转变,增加工厂方法接口的方法就重构出了抽象工厂。

二、实例讲解(以访问DB为例)

1、Simple Factory

【大话设计模式】——工厂三姐妹一、概念介绍二、实例讲解(以访问DB为例)三、比较四、感受

      创建一个简单工厂,用来创建实例化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

【大话设计模式】——工厂三姐妹一、概念介绍二、实例讲解(以访问DB为例)三、比较四、感受

    需要用到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

【大话设计模式】——工厂三姐妹一、概念介绍二、实例讲解(以访问DB为例)三、比较四、感受

   增加了访问的数据库中的表,只需增加相应的类以及接口,在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三个工厂类。

四、感受

    刚开始的时候觉得有些地方还是有点不太理解,等到总结要画图的时候突然就明白了一些,看来还是画图的作用大啊,往下学设计模式的时候要边画图边敲代码,这样理解会好一些的。     不足之处:对这三个模式的学习时间长了一些,丢了宏观。接下来要好好调整一下战略。