1. 程式人生 > >【設計模式】單例模式、三個工廠模式

【設計模式】單例模式、三個工廠模式

interface IFactory
    {
        Operation CreateOperation();
    }

    class AddFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }

    class SubFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }

    class MulFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }

    class DivFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }

比較:簡單工廠的優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的條件選擇使用哪一種計算方法,但是如果增加新的方法需要在原有的工廠類中增加,這樣就違反了設計模式的一個很重要的原則開放-封閉原則。工廠方法正是很好的解決了這個缺點,通過對每一種方法建立類,通過介面實現計算工廠達到不需要開啟簡單工廠的唯一工廠就可以增加新的功能方法,滿足了擴充套件性。工廠方法把簡單工廠的內部邏輯判斷轉移到了客戶端,你想要增加功能原本修改工廠類,現在是修改客戶端。

抽象工廠:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

interface IDepartment
    {
        void Insert(Department department);
        IDepartment GetDepartment(int id);
    }

    class SqlserverDepartment : IDepartment  //SqlserverDepartment類,用於訪問sql server的Department
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在SQL server中給User表增加一條記錄");
        }
        public Department GetDaparment(int id)
        {
            Console.WriteLine("在SQL server中根據ID得到user表中的一條記錄");
            return null;
        }
    }

    class AccessDepartment : IDepartment     //AccessDepartment類,用於訪問Access的Department
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在SQL server中給User表增加一條記錄");
        }
        public Department GetDaparment(int id)
        {
            Console.WriteLine("在SQL server中根據ID得到user表中的一條記錄");
            return null;
        }
    }

    interface IFactory   //IFactory介面,定義一個建立訪問Department物件的抽象的工廠介面
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }

    class SqlserverFactory : IFactory   //sqlserverFactory類,實現IFactory介面,例項化sqlserverUser和sqlserverDepartment 
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }
        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }

    class AccessFactory : IFactory    //AccessFactory類,實現IFactory介面,例項化AccessUser和AccessDepartment
    {
        public IUser CreateUser()
        {
            return new AccessFactory();
        }
        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    }

優點:具體的建立例項過程與客戶端分離,客戶端通過他們的抽象介面操縱實現,產品的具體類名也被具體工廠實現分離。

什麼時候能夠用到抽象工廠:就是能夠像這樣抽象的時候(這個我也不知道該怎麼表達只能意會了)

資料庫訪問的實現:

兩種抽象產品:增加記錄、得到記錄

四種具體產品:SQLserver增加記錄、SQLserver得到記錄、Access增加記錄、Access得到記錄

具體工廠角色:Access、SQLserver

舉例:農場系統的實現

兩種抽象產品:水果、蔬菜

四種具體產品:北方水果,熱帶水果,北方蔬菜,熱帶蔬菜
具體工廠角色:北方工廠,熱帶角色