設計模式(3)---抽象工廠模式及工廠模式總結

1、引言  sql

  在前面分別講述了簡單工廠模式和工廠模式,工廠方法模式是爲了克服簡單工廠模式的缺點而設計出來的,可是在現實生活中,一個工廠只建立單個產品這樣的例子不多,由於如今工廠都多元化了,是一個工廠建立一系列產品,此時工廠模式顯示不適用,抽象工廠模式能夠很好的解決此問題。本節學習抽象工廠模式,最後會對這三種模式作簡單總結,加深對這幾種模式的理解。數據庫

  

2、定義ide

  抽象工廠模式:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。sqlserver

   角色:學習

  抽象工廠:聲明生成一系列抽象產品的方法。具體工廠:執行生成一系列抽象產品的方法,生成一系列具體的產品。spa

  抽象產品:聲明一系列某一種產品的接口。具體產品:定義具體工廠生成的具體產品的對象,實現產品接口。設計

 

3、UML圖:code

  

 

4、舉例說明:server

  在實際項目中,須要用到數據庫,必然有一些數據庫鏈接語句。在本例中,項目須要同時兼任sqlserver和access兩種數據庫,爲了更加便利地解決此問題,用抽象工廠解決。 對象

  抽象產品和具體產品角色: 

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圖看看:

 

  下面貼出一段代碼:

class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();

            IFactory factory = new AccessFactory();

            IUser iu = factory.CreateUser();
            iu.Insert(user);
            iu.GetUser(1);

            IDepartment id = factory.CreateDepartment();
            id.Insert(dept);
            id.GetDepartment(1);

            Console.Read();
        }
    }

    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);
        User GetUser(int id);
    }

    class SqlserverUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在sqlserver中給User表增長一條記錄");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在sqlserver中根據ID獲得User表一條記錄");
            return null;
        }
    }

    class AccessUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Access中給User表增長一條記錄");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在Access中根據ID獲得User表一條記錄");
            return null;
        }
    }

    class Department
    {
        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 IDepartment
    {
        void Insert(Department department);
        Department GetDepartment(int id);
    }

    class SqlserverDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在sqlserver中給Department表增長一條記錄");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在sqlserver中根據ID獲得Department表一條記錄");
            return null;
        }
    }

    class AccessDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Access中給Department表增長一條記錄");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根據ID獲得Department表一條記錄");
            return null;
        }
    }

    interface IFactory
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }

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

        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }

    class AccessFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new AccessUser();
        }

        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }
View Code

  它的UML類圖以下:

  

 

  抽象工廠模式的定義是:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

  工廠模式定義:定義一個用於建立對象的接口,讓子類決定實例化哪個類。

  簡單工廠:一個類專門負責建立其餘類的實例,具體建立什麼實例由傳入的參數而決定,而且這些類都共同繼承於一個父類或者有共同的接口。

  從抽象工廠的UML類圖和工廠模式的UMl類圖中彷佛能夠看出其區別,抽象工廠模式是提供一系列對象的接口,而工廠模式則不是。(不知道理解的對不對)。抽象工廠模式有多個方法,是建立多個產品的,工廠模式只有一個方法,建立一種產品。(這裏能夠在IUser中加入多個方法,此處暫時沒有添加。)既然抽象工廠、工廠模式的UML類圖都有了,今天把簡單工廠的也放在一塊兒,對比出效果。

  簡單工廠UML:

 

  總而言之:

  簡單工廠:是系統根據外界傳入的具體信息建立所需的實例,等因而客戶端沒必要關心產品如何生產,只負責指定生產什麼產品。

  工廠模式:讓子類決定建立什麼產品,即:使一個類的實例化延遲到子類。

  抽象工廠模式:便於交換產品系列,同時讓具體的建立實例過程與客戶端分離,客戶端是經過它們的抽象接口操縱實例,產品的具體類名也被具體工廠的實現分離,不會出如今客戶端。

相關文章
相關標籤/搜索