一 前言
在設計模式中有簡單工廠,工廠方法,抽象工廠,這三種工廠方法,各自有各自的特點,但有都有共同的特點 工廠(Factory)都是圍繞着工廠類轉,這篇只寫 "抽象工廠"相關的內容 上一篇的地址在這里
設計模式你怎么看?--簡單工廠模式
二 抽象工廠介紹
2.1 什么是抽象工廠模式
抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象(來自百科)
2.2 抽象工廠模式優缺點
優點:易於更改產品類型 如 可以很方便的更改SqlFactory 與OracleFactory,另外使得客戶端於業務層分離,客戶端所接觸的都是IProductA 和IFactory
缺點:當新增一種產品類型時改動會較大,例如當需要增加ProductB時需要增加IProductB SqlProductB OracleProductB,還要修改IFactory,SqlFactory,OracleFactory。
2.3 抽象工廠模式UML類圖
業務情景如下:在某個系統中未來可能會更換數據庫類型如SQLServer,Access ,Oracle 等。要求修改與維護的成本要低。在這種情況下用抽象工廠解決這種問題是很好的因為不同數據庫對CRUD操作是語法不完全相同,因此比較好的方法是定義一個抽象類或接口然后讓不同的子類去實現自己的變化,再通過各自的工廠方法將實例提供到客戶端
下圖正是這么一個過程每個Product都有自己的接口與工廠,在調用時Client調用SqlFactory然后返回SqlProductA的實例到Client中

三 抽象工廠代碼
定義工廠的接口規范所有不同類型的工廠類
//工廠接口 public interface IFactory { IProductA CreateInstance(); }
具體類型的工廠類 用於創建對應類型的產品實例
//Sql類型的工廠類 class SqlFactory : IFactory { public IProductA CreatProductA() { return new SqlProductA(); } }
同上
//Oracle類型的工廠類 class OracleFactory:IFactory { public IProductA CreatProductA() { return new OracleProductA(); } }
定義具體產品的共有特性
//定義ProductA所共有的方法 public interface IProductA { void CreatProductA(); void DeleteProductA(); }
具體產品特性的實現
//實現IProductA定義的共有方法 class SqlProductA:IProductA { public void CreatProductA() { Console.Write("新增SQLServer下的ProductA"); } public void DeleteProductA() { Console.Write("刪除一個SQLServer下的ProductA"); } }
//實現ProductA共有方法 class OracleProductA:IProductA { public void CreatProductA() { Console.Write("新增Oracle下的ProductA"); } public void DeleteProductA() { Console.Write("刪除一個Oracle下的ProductA"); } }
客戶端調用
//SQL類型 IFactory sqlFactory = new SqlFactory(); IProductA sql = sqlFactory.CreatProductA(); sql.CreatProductA(); sql.DeleteProductA(); //Oracle類型 IFactory oracleFactory = new OracleFactory(); IProductA oracle = oracleFactory.CreatProductA(); oracle.CreatProductA(); oracle.DeleteProductA();
結果如下

四 總結
設計模式的根本目的是讓程序之間的耦合降低,提高程序的健壯性,任何業務的與代碼的變化都是要付出代價的。學會把設計模式應用到實際項目中,可以適當的降低這種代價,但任何事都是具有兩面性的,減少耦合代碼量肯定是要增加的。嘗試找到平衡點設計模式就是才是真正用好了。
本人水平有限,如有不對之處還請指出 謝謝~
如果您覺得本文有給您帶來一點收獲,不妨點個推薦,為我的付出支持一下,謝謝~
如果希望在技術的道路上能有更多的朋友,那就關注下我吧,讓我們一起在技術的路上奔跑
