1. 程式人生 > 其它 >設計模式之:抽象工廠模式AbstractFactoryPattern的實現

設計模式之:抽象工廠模式AbstractFactoryPattern的實現

相比於工廠模式,抽象工廠模式的每個工廠可以建立產品系列,而不是一個產品;

抽象工廠用到的技術:介面、多型、配置檔案、反射;

抽象工廠模式的設計原則:

  • 實現客戶端建立產品和使用產品的分離,客戶端無須瞭解建立的細節,符合迪米特法則
  • 客戶端面向介面定義產品,符合依賴倒置原則
  • 客戶端面向介面定義工廠,而實際根據配置檔案生成工廠實現類,符合里氏替換原則
  • 增加新的產品族時,無須修改原有程式碼,符合開閉原則
  • 使用配置檔案,而不是硬編碼方式指定建立的具體工廠,符合迪米特法則
  • 相較於簡單工廠模式,抽象工廠中,一個工廠只負責某一產品系列的建立,而不是所有產品的建立,符合單一職責原則

類圖 with SartUML

工廠介面和兩個實現類

    internal interface SkinFactory
    {
        Button CreateButton();
        TextField CreateTextField();
        ComboBox CreateComboBox();
    }
    internal class SpringSkinFactory : SkinFactory
    {
        public Button CreateButton()
        {
            return new SpringButton();
        }

        public ComboBox CreateComboBox()
        {
            return new SpringComboBox();
        }

        public TextField CreateTextField()
        {
            return new SpringTextField();
        }
    }
    internal class SummerSkinFactory : SkinFactory
    {
        public Button CreateButton()
        {
            return new SummerButton();
        }

        public ComboBox CreateComboBox()
        {
            return new SummerComboBox();
        }

        public TextField CreateTextField()
        {
            return new SummerTextField();
        }
    }

Button產品介面和兩個實現類

    internal interface Button
    {
        void Display();
    }
    internal class SpringButton : Button
    {
        public void Display()
        {
            Console.WriteLine("綠色按鈕");
        }
    }
    internal class SummerButton : Button
    {
        public void Display()
        {
            Console.WriteLine("藍色按鈕");
        }
    }

TextField產品的介面和兩個實現類

    internal interface TextField
    {
        void Display();
    }
    internal class SpringTextField : TextField
    {
        public void Display()
        {
            Console.WriteLine("綠色文字框");
        }
    }
    internal class SummerTextField : TextField
    {
        public void Display()
        {
            Console.WriteLine("藍色文字框");
        }
    }

ComboBox產品的介面和兩個實現類

    internal interface ComboBox
    {
        void Display();
    }
    internal class SpringComboBox : ComboBox
    {
        public void Display()
        {
            Console.WriteLine("綠色組合框");
        }
    }
    internal class SummerComboBox : ComboBox
    {
        public void Display()
        {
            Console.WriteLine("藍色組合框");
        }
    }

配置檔案

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="factoryType" value="AbstractFactoryPattern.SpringSkinFactory"/>
	</appSettings>
</configuration>

客戶端

    internal class Program
    {
        static void Main(string[] args)
        {
            //面向介面定義,使用多型,便於擴充套件
            SkinFactory factory;
            Button button;
            TextField textField;
            ComboBox comboBox;
            //讀取配置檔案
            string factoryType = ConfigurationManager.AppSettings["factoryType"];
            //反射建立工廠物件
            factory = Assembly.Load("AbstractFactoryPattern").CreateInstance(factoryType)as SkinFactory;
            //工廠建立UI物件
            button = factory.CreateButton();
            textField = factory.CreateTextField();
            comboBox = factory.CreateComboBox();
            button.Display();
            textField.Display();
            comboBox.Display();
            Console.Read();
        }
    }

 

執行結果: