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(); } }
它的UML類圖以下:
抽象工廠模式的定義是:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
工廠模式定義:定義一個用於建立對象的接口,讓子類決定實例化哪個類。
簡單工廠:一個類專門負責建立其餘類的實例,具體建立什麼實例由傳入的參數而決定,而且這些類都共同繼承於一個父類或者有共同的接口。
從抽象工廠的UML類圖和工廠模式的UMl類圖中彷佛能夠看出其區別,抽象工廠模式是提供一系列對象的接口,而工廠模式則不是。(不知道理解的對不對)。抽象工廠模式有多個方法,是建立多個產品的,工廠模式只有一個方法,建立一種產品。(這裏能夠在IUser中加入多個方法,此處暫時沒有添加。)既然抽象工廠、工廠模式的UML類圖都有了,今天把簡單工廠的也放在一塊兒,對比出效果。
簡單工廠UML:
總而言之:
簡單工廠:是系統根據外界傳入的具體信息建立所需的實例,等因而客戶端沒必要關心產品如何生產,只負責指定生產什麼產品。
工廠模式:讓子類決定建立什麼產品,即:使一個類的實例化延遲到子類。
抽象工廠模式:便於交換產品系列,同時讓具體的建立實例過程與客戶端分離,客戶端是經過它們的抽象接口操縱實例,產品的具體類名也被具體工廠的實現分離,不會出如今客戶端。