天天看點

【大話設計模式】——工廠三姐妹一、概念介紹二、執行個體講解(以通路DB為例)三、比較四、感受

    最近在看設計模式,故事好玩是好玩,可是代碼也很多啊,有時候看圖不太了解,為了讓自己有興趣并且堅持下去,在第一遍宏觀的看了一遍之後,把23種設計模式進行了一下分類,然後再找類似的模式一起學習,通過對比學習再了解,确實是容易了一些。先學的建立型模式裡的工廠三姐妹,一塊學習這三個模式,比較一下它們的優缺點,知道什麼時候要用什麼模式。

一、概念介紹

1、簡單工廠:Simple Factory,是由一個工廠對象決定建立出哪一種産品類的執行個體,是工廠模式家族中最簡單實用的模式。

個人了解:将界面與業務邏輯分離,分離出一個類專門來建立執行個體的過程。

2、工廠方法:Factory Method,定義一個用于建立對象的接口,讓子類決定執行個體化哪一個類,工廠方法使一個類的執行個體化延遲到其子類。

個人了解:為了遵循擴充開放,修改關閉原則,将簡單工廠類轉換為工廠方法接口,将其Switch分支分離成子類去繼承工廠方法接口類,順利的将建立對象的過程延遲到子類。

3、抽象工廠:Abstract Factory,提供一個建立一系列相關或互相依賴對象的接口,而無需指定他們具體的類。

個人了解:工廠方法模式的轉變,增加工廠方法接口的方法就重構出了抽象工廠。

二、執行個體講解(以通路DB為例)

1、Simple Factory

【大話設計模式】——工廠三姐妹一、概念介紹二、執行個體講解(以通路DB為例)三、比較四、感受

      建立一個簡單工廠,用來建立執行個體化User類和Department類。在用戶端代碼中直接得到資料庫通路執行個體即可,不依賴與Sqlserver與Access資料庫。

用戶端代碼:

static void Main(string [] args)
        {
            User user = new User();
            Department department = new department();
            
            IUser su=DataAccess.CreateUser ();
            su.Insert(user);
            su.GetUser(1);

            IDepartment ide = DataAccess.CreateDepartment();
            ide.Insert(department);
            ide.GetDepartment(343);

            Console.Read();
        }
           

2、Factory Method

【大話設計模式】——工廠三姐妹一、概念介紹二、執行個體講解(以通路DB為例)三、比較四、感受

    需要用到3個工廠,達到了業務邏輯與資料通路分離,用戶端代碼在運作時不需要知道在通路哪個資料庫。

用戶端代碼:

static void Main(string [] args)
        {
            User user = new User();
            
            Ifactory factory=new AccessFactory();

            IUser su=factory.CreateUser ();
            su.Insert(user);
            su.GetUser(1);

            Console.Read();
        }
           

3、Abstract Factory

【大話設計模式】——工廠三姐妹一、概念介紹二、執行個體講解(以通路DB為例)三、比較四、感受

   增加了通路的資料庫中的表,隻需增加相應的類以及接口,在Ifactory接口中增加相對應的建立對象的方法即可。

用戶端代碼(與工廠方法類似):

static void Main(string [] args)
        {
            User user = new User();
            Department department = new Department();
           
            Ifactory factory=new AccessFactory();//确定執行個體化哪一個資料庫通路對象給factory
           
            IUser su=factory.CreateUser ();//與具體的資料庫解除了依賴
            su.Insert(user);
            su.GetUser(1);

            IDepartment ide = factory.CreateDepartment();
            ide.Insert(department);
            ide.GetDepartment(343);

            Console.Read();
        }
           

三、比較

1、簡單工廠VS工廠方法

相同點:都達到了業務邏輯與通路資料的分離。

不同點:

(1)簡單工廠:對象的執行個體化在工廠中,需要用Switch進行條件選擇,違背了修改關閉的原則,但是對于用戶端來說,去除了對具體産品的依賴。

(2)工廠方法:将執行個體化的過程延遲到子類,工廠方法将内部邏輯判斷轉移到了用戶端中,隻需要修改用戶端即可。遵循了開放——封閉原則。

2、抽象工廠優點VS缺點

優點:改變一個産品系列時,隻需改變具體的工廠即可,沒有其他的變動,與具體産品無關。遵循了開放——封閉原與依賴倒轉原則。

缺點:如果增加一個功能,就要增加相應的類,接口,還要改變Ifactory工廠,SqlserverFactory以及AccessFactory三個工廠類。

四、感受

    剛開始的時候覺得有些地方還是有點不太了解,等到總結要畫圖的時候突然就明白了一些,看來還是畫圖的作用大啊,往下學設計模式的時候要邊畫圖邊敲代碼,這樣了解會好一些的。     不足之處:對這三個模式的學習時間長了一些,丢了宏觀。接下來要好好調整一下戰略。

繼續閱讀