文章出處

前言

設計模式目錄:

本篇目錄:

  其實大家都知道,在工廠方法(Factory Method)模式之前有個簡單工廠模式,也就是靜態工廠方法(Static Factory Method)模式,在簡單工廠模式之前有個我們都熟悉的三層架構模式,那我們就上到下一層一層的來了解下。

三層架構

  三層架構我們都熟悉,一開始編程的時候也是用的最多,分為:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL),實現了“高內聚,低耦合”的思想。

  關于三層架構不需要說太多,我當時學習的時候,無意間看到李天平老師關于三層的趣味理解,覺得還蠻有意思的,很適合初學者理解,和大家分享下:

  • 數據庫好比豬圈,所有的豬有序地按區域或編號,存放在不同的豬欄里。
  • DAL好比是屠宰場,把豬從豬圈取出來進行(處理)屠殺,按要求取出相應的部位(字段),或者進行歸類整理(統計),形成整箱的豬肉(數據集),傳送給食品加工廠(BLL)。本來這里都是同一伙人既管抓豬,又管殺豬的,后來覺得效率太低了,就讓一部分人出來專管抓豬了(DBUtility),根據要求來抓取指定的豬。
  • BLL好比食品加工廠,將豬肉深加工成各種可以食用的食品(業務處理)。
  • Web好比商場,將食品包裝成漂亮的可以銷售的產品,展現給顧客(UI表現層)。
  • 豬肉好比Model,無論是哪個廠(層),各個環節傳遞的本質都是豬肉,豬肉貫穿整個過程。
  • 通用類庫Common相當于工人使用的各種工具,為各個廠(層)提供諸如殺豬刀、繩子、剪刀、包裝箱、工具車等共用的常用工具(類)。其實,每個部門本來是可以自己制作自己的工 具的,但是那樣會使效率比較低,而且也不專業,并且很多工作都會是重復的。因此,就專門有人開了這樣的工廠來制作這些工具,提供給各個工廠,有了這樣的分工,工廠就可以專心做自己的事情了。

  通過上面的趣味理解,腦海中應該對三層有個了解了。說到這,其實如果大家學習過MVC(模型Model-視圖View-控制器Controller)的話,就發現和三層架構有點相似,都有一個表現層,但是其他兩層就不同了,三層架構中沒有Controller這個概念,MVC也沒有把業務的邏輯訪問看成兩個層,這是采用三層架構或MVC搭建程序最主要的區別。當然了。在三層中也提到了Model,但是三層架構中Model的概念與MVC中Model的概念是不一樣的,“三層”中典型的Model層是以實體類構成的,而MVC里,則是由業務邏輯與訪問數據組成的。

簡單工廠模式

  靜態工廠方法(Static Factory Method)模式其實不屬于GOF所提出的設計模式中,我們一般在應用的時候結合三層模式下使用工廠模式使用多點,例如下面的解決方案:

  上面的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)模式

  工廠方法(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

  騷年們,和小菜一起整理學習吧,未完待續。。。

 


文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()