抽象工厂模式及工厂模式总结

2014-11-23 23:26:20 · 作者: · 浏览: 1

在前面分别讲述了简单工厂模式和工厂模式,本节学习抽象工厂模式,最后会对这三种模式做简单总结,加深对这几种模式的理解。

  

  定义:

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

  角色:

  抽象工厂:声明生成一系列抽象产品的方法。具体工厂:执行生成一系列抽象产品的方法,生成一系列具体的产品。

  抽象产品:声明一系列某一种产品的接口。具体产品:定义具体工厂生成的具体产品的对象,实现产品接口。

  UML图:

  \

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CqGhoaG+2cD9y7XD96O6PC9wPgo8cD4KoaGhodTayrW8ys/uxL/W0KOs0OjSqtPDtb3K/b7dv+KjrLHYyLvT0NK70KnK/b7dv+LBrL3T0+++5KGj1NqxvsD91tCjrM/uxL/Q6NKqzazKsbzmyM5zcWxzZXJ2ZXK6zWFjY2Vzc8G91tbK/b7dv+KjrM6qwcu4/LzTsePA+7XYveK+9rTLzsrM4qOs08Oz6c/zuaSzp73ivvaho6GhPC9wPgo8cD4KoaGhobPpz/Oy+sa3us2+38zlsvrGt73HyaujuqGhPC9wPgoKPGltZyBzcmM9"https://www.cppentry.com/upload_files/article/76/1_ozf08__.gif" alt="复制代码">

class User
    {
        private int id;
        public int ID
        {
            get { return id; }
            set { id = value; }
        }

        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

    interface IUser
    {
        void Insert(User user);
    }

    class SqlserverUser:IUser 
    {
        public void Insert(User user)
        {
            Console.WriteLine("在sqlserver中给User表增加一条记录");
        }
    }

    class AccessUser:IUser 
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Access中给User表增加一条记录");
        }
    }
复制代码

  抽象工厂和具体工厂角色: 

复制代码
interface IFactory
    {
        IUser CreateUser();
    }

    class SqlserverFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }
    }

    class AccessFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new AccessUser();
        }
    }
复制代码

  客户端调用: 

User user = new User();

            IFactory factory = new SqlserverFactory();
            IUser iu = factory.CreateUser();
            iu.Insert(user);

  看了上面这个实例,给人的感觉就是工厂模式,而不是抽象工厂,对不对?我的理解也是如此。给出UML图看看:

\

  下面贴出一段代码:

\ View Code

  它的UML类图如下:

  \

  抽象工厂模式的定义是:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  工厂模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

  简单工厂:一个类专门负责创建其他类的实例,具体创建什么实例由传入的参数而决定,并且这些类都共同继承于一个父类或者有共同的接口。

  从抽象工厂的UML类图和工厂模式的UMl类图中似乎可以看出其区别,抽象工厂模式是提供一系列对象的接口,而工厂模式则不是。(不知道理解的对不对)。抽象工厂模式有多个方法,是创建多个产品的,工厂模式只有一个方法,创建一种产品。(这里可以在IUser中加入多个方法,此处暂时没有添加。)既然抽象工厂、工厂模式的UML类图都有了,今天把简单工厂的也放在一起,对比出效果。

  简单工厂UML:

  楗 y系统根据外界传入的具体信息创建所需的实例,等于是客户端不必关心产品如何生产,只负责指定生产什么产品。

  工厂模式:让子类决定创建什么产品,即:使一个类的实例化延迟到子类。

  抽象工厂模式:便于交换产品系列,同时让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端。