設計模式目錄:html
本篇目錄:數據庫
其實你們都知道,在工廠方法(Factory Method)模式以前有個簡單工廠模式,也就是靜態工廠方法(Static Factory Method)模式,在簡單工廠模式以前有個咱們都熟悉的三層架構模式,那咱們就上到下一層一層的來了解下。工具
三層架構咱們都熟悉,一開始編程的時候也是用的最多,分爲:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL),實現了「高內聚,低耦合」的思想。post
關於三層架構不須要說太多,我當時學習的時候,無心間看到李天平老師關於三層的趣味理解,以爲還蠻有意思的,很適合初學者理解,和你們分享下:學習
經過上面的趣味理解,腦海中應該對三層有個瞭解了。說到這,其實若是你們學習過MVC(模型Model-視圖View-控制器Controller)的話,就發現和三層架構有點類似,都有一個表現層,可是其餘兩層就不一樣了,三層架構中沒有Controller這個概念,MVC也沒有把業務的邏輯訪問當作兩個層,這是採用三層架構或MVC搭建程序最主要的區別。固然了。在三層中也提到了Model,可是三層架構中Model的概念與MVC中Model的概念是不同的,「三層」中典型的Model層是以實體類構成的,而MVC裏,則是由業務邏輯與訪問數據組成的。
this
靜態工廠方法(Static Factory Method)模式其實不屬於GOF所提出的設計模式中,咱們通常在應用的時候結合三層模式下使用工廠模式使用多點,例以下面的解決方案:url
上面的SeManage.IDAL就至關於抽象產品,SeManage.SQLServerDAL至關於具體產品,SeManage.DALFactory至關於工廠,決定生成何種商品的工廠。
1 /// <summary> 2 /// dal工廠 3 /// </summary> 4 public sealed class DataAccess 5 { 6 private static readonly string SQLServicePath = ConfigurationManager.AppSettings["SQLServerDAL"]; 7 public DataAccess() 8 { } 9 10 /// <summary> 11 /// 建立Changdi數據層接口。 12 /// </summary> 13 public static SeManage.IDAL.IChangdi CreateChangdi() 14 { 15 string className = SQLServicePath + ".Changdi"; 16 return (SeManage.IDAL.IChangdi)Assembly.Load(SQLServicePath).CreateInstance(className); 17 } 18 }
1 <add key="SQLServerDAL" value="SeManage.SQLServerDAL"/>
上面的代碼表示根據配置文件來建立何種具體抽象類的實例(產品),下面的配置就像工廠機器的開關,決定生產哪一種產品。
經過上面的代碼,咱們也會發現一些問題,若是產品的種類較多,工廠類裏面的生產產品的方法也多,若是出現新的產品,那咱們就必須在工廠類裏面添加生產新產品的方法,這樣就違反了高內聚責任分配原則,使代碼變的不容易維護。
工廠方法(Factory Method)模式是在GOF提出的設計模式中有定義的,以下:爲建立對象定義一個接口,讓子類決定實例化哪一個類,工廠方法讓一個類的實例化延遲至子類。
其實從某種方面能夠說,工廠方法模式是簡單工廠模式的衍生,也解決了簡單工廠模式所出現的問題,例如上面所提到的。工廠方法模式其實就是把工廠抽象化了,咱們能夠把工廠方法模式拆分紅四個元素:抽象工廠(IFactory)、具體工廠(Concrete Factory)、抽象產品(Product)和具體產品(Concrete Product)。根據這四個元素,咱們能夠簡單的畫下UML類圖:
根據上面的UML類圖,不難實現其代碼:
1 /// <summary> 2 /// 產品接口 3 /// </summary> 4 public interface ICar 5 { 6 void Travel(); 7 } 8 9 /// <summary> 10 /// 具體產品 11 /// </summary> 12 public class Lexus : ICar 13 { 14 public void Travel() 15 { 16 Console.WriteLine("I'm a lexus car, I'm traveling"); 17 } 18 } 19 20 /// <summary> 21 /// 工廠接口 22 /// </summary> 23 public interface ICarFactory 24 { 25 ICar CreateCar(); 26 } 27 28 /// <summary> 29 /// 具體工廠類 30 /// </summary> 31 public class LexusFactory : ICarFactory 32 { 33 public ICar CreateCar() 34 { 35 return new Lexus(); 36 } 37 } 38 39 40 public class Client 41 { 42 private ICarFactory carFactory; 43 public Client(ICarFactory carFactory) 44 { 45 this.carFactory = carFactory; 46 } 47 48 public void doSomething() 49 { 50 ICar car = carFactory.CreateCar(); 51 car.Travel(); 52 //to do something 53 } 54 }
調用示例代碼:
1 static void Main(string[] args) 2 { 3 Client client = new Client(new LexusFactory()); 4 client.doSomething(); 5 }
從上面的代碼咱們能夠看出,工廠方法模式的對簡單工廠模式進行了抽象。有一個抽象的Factory類(能夠是抽象類和接口),這個類將再也不負責具體的產品生產,而是隻制定一些規範, 具體的生產工做由其子類去完成。在這個模式中,工廠類和產品類每每能夠依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。其實單從這一點上,咱們就會發現,和咱們以前說的《小菜學習設計模式(一)—模板方法(Template)模式》中提到的模板方法模式的思想有些共同的地方,其實工廠方法(Factory Method)模式是最典型的模板方法(Template Method)模式的應用。
示例代碼下載:FactoryMethod.rar
插一句:上面的UML是用Edraw Mind Map這一款繪圖軟件畫的,感受還不錯,能夠畫大部分的圖,還在熟悉中,綠色版的哦。
下載地址:Edraw Mind Map.rar
騷年們,和小菜一塊兒整理學習吧,未完待續。。。