在設計模式中有簡單工廠,工廠方法,抽象工廠,這三種工廠方法,各自有各自的特色,但有都有共同的特色 工廠(Factory)都是圍繞着工廠類轉,這篇只寫 "抽象工廠"相關的內容 上一篇的地址在這裏html
2.1 什麼是抽象工廠模式 sql
抽象工廠模式是全部形態的工廠模式中最爲抽象和最具通常性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式能夠向客戶端提供一個接口,使客戶端在沒必要指定產品的具體的狀況下,建立多個產品族中的產品對象(來自百科)數據庫
2.2 抽象工廠模式優缺點設計模式
優勢:易於更改產品類型 如 能夠很方便的更改SqlFactory 與OracleFactory,另外使得客戶端於業務層分離,客戶端所接觸的都是IProductA 和IFactoryoracle
缺點:當新增一種產品類型時改動會較大,例如當須要增長ProductB時須要增長IProductB SqlProductB OracleProductB,還要修改IFactory,SqlFactory,OracleFactory。post
2.3 抽象工廠模式UML類圖url
業務情景以下:在某個系統中將來可能會更換數據庫類型如SQLServer,Access ,Oracle 等。要求修改與維護的成本要低。在這種狀況下用抽象工廠解決這種問題是很好的由於不一樣數據庫對CRUD操做是語法不徹底相同,所以比較好的方法是定義一個抽象類或接口而後讓不一樣的子類去實現本身的變化,再經過各自的工廠方法將實例提供到客戶端 spa
下圖正是這麼一個過程每一個Product都有本身的接口與工廠,在調用時Client調用SqlFactory而後返回SqlProductA的實例到Client中設計
定義工廠的接口規範全部不一樣類型的工廠類3d
//工廠接口 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();
結果以下
設計模式的根本目的是讓程序之間的耦合下降,提升程序的健壯性,任何業務的與代碼的變化都是要付出代價的。學會把設計模式應用到實際項目中,能夠適當的下降這種代價,但任何事都是具備兩面性的,減小耦合代碼量確定是要增長的。嘗試找到平衡點設計模式就是纔是真正用好了。
本人水平有限,若有不對之處還請指出 謝謝~
若是您以爲本文有給您帶來一點收穫,不妨點個推薦,爲個人付出支持一下,謝謝~
若是但願在技術的道路上能有更多的朋友,那就關注下我吧,讓咱們一塊兒在技術的路上奔跑