抽象工廠的繼續學習

來源:互聯網
上載者:User

抽象原廠模式

1)抽象原廠模式(Abstract
Factory
,提供一個建立一系列相關或相互依賴對象的介面,而無需制定它們具體的類。

2)以不同資料庫中的兩種表為例

3)適用性

在以下情況下可以試用AbstractFactory模式

  • 一個系統要獨立於它的產品的建立、組合和表示時。
  • 一個系統要多個產品系列中的一個來配置。
  • 當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
  • 當你提供一個產品類庫,而只想顯示它們的介面而不是實現。

 

4)抽象原廠模式的優缺點

優點:

  • 具體產品從用戶端代碼中分離出來,
  • 容易改變產品的系列,由於具體工廠類,在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易.
  • 將一個系列的產品族統一到一起建立。

缺點:

產品族中擴充新的產品是很困難的,它需要修改抽象工廠的介面。(如果增加項目表Project,就需要增加三個類,Iproject、SqlserverProject、AcessProject,還需要改Ifactory、SqlserverFactory和AcessFactory才可以完全實現。要改三個類,這就太糟糕了。)

5)用簡單工廠來改進抽象工廠

代碼:

classDataAccess

    {

        private static readonly string db ="Sqlserver";

 

        public static IUser CreateUser()

        {

            IUser result = null;

            switch (db)

            {

                case "Sqlserver":

                    result =new SqlserverUser();

                    break;

                case "Access":

                    result = new AccessUser();

                    break;

            }

            return result;

        }

 

        public static IDepartmentCreateDepartment()

        {

            IDepartment result = null;

            switch(db)

            {

                case "Sqlserver":

                    result=newSqlserverDepartment ();

                    break;

                case "Access":

                    result  =new AccessDepartment ();

                    break;

                     

            }

            return result;

            }

    }

 

 

 static void Main(string[] args)

        {

            User user = new User();

            Department dept = new Department();

            IUser iu = DataAccess.CreateUser();

 

            iu.Insert(user);

            iu.GetUser(1);

 

            IDepartment id =DataAccess.CreateDepartment();

            id.Insert (dept);

            id.GetDepartment(1);  

 

            Console.Read();

        }

6)用反射+抽象工廠的資料訪問程式(根據字串去哪個地方應該要執行個體化那一個類,這樣可以去掉Case語句)

classDataAccess

    {

        private static readonly stringAssemblyName = "抽象工廠五";

        private static readonly string db ="Sqlserver";

 

        public static IUser CreateUser()

        {

            string className = AssemblyName +"." + db + "User";

            return(IUser)Assembly.Load(AssemblyName).CreateInstance(className);

        }

        public static IDepartmentCreateDepartment()

        {

            string className = AssemblyName +"." + db + "Departemnt";

            return(IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);

        }

    }

6)用反射+設定檔實現資料訪問程式(來解決更改資料庫的問題。)

設定檔:

<?xmlversion="1.0" encoding="utf-8" ?>

<configuration>

    <startup>

        <supportedRuntimeversion="v4.0" sku=".NETFramework,Version=v4.5" />

    </startup>

<appSettings >

<add key ="DB" value="Sqlserver"/>

</appSettings>

</configuration>

 

在開頭添加  using
System.configuration,有時候還是提示錯誤,這就需要添加引用+程式集中找到system.configuration勾選上即可

 

在代碼中添加設定檔(改DB賦值即可):

privatestatic readonly string db = ConfigurationManager.AppSettings["DB"];

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.