1. 程式人生 > 其它 >設計模式之:工廠方法模式FactoryMethodPattern的實現

設計模式之:工廠方法模式FactoryMethodPattern的實現

本例用到了配置檔案、介面、反射、多型;

滿足的設計原則:

  • 通過工廠,實現建立物件和使用物件的分離,實現鬆耦合,滿足迪米特法則
  • 通過配置檔案指定建立物件型別,而不需更改原始碼,滿足開閉原則
  • 容易實現功能擴充套件,只需新增新的Logger實現類和新的Factory實現類即可,無須更改原始碼,滿足開閉原則
  • 面向介面程式設計,而不是面向具體實現類程式設計,滿足依賴倒置原則
  • 面向介面程式設計,客戶端實際使用的是實現類,用實現類替換介面類,滿足里氏替換原則

類圖 with StarUML

Logger介面及其實現類:

/// <summary>
    /// LLogger介面
    /// </summary>
    internal interface Logger
    {
        void WriteLog();
    }
    internal class FileLogger : Logger
    {
        public void WriteLog()
        {
            Console.WriteLine("檔案日誌記錄");
        }
    }
    internal class DatabaseLogger : Logger
    {
        public void WriteLog()
        {
            Console.WriteLine("資料庫日誌記錄");
        }
    }

Factory介面及其實現類:

    internal interface LoggerFactory
    {
        Logger CreateLogger();
    }
    internal class FileLoggerFactory : LoggerFactory
    {
        public Logger CreateLogger()
        {
            return new FileLogger();
        }
    }
    internal class DatabaseLoggerFactory : LoggerFactory
    {
        public Logger CreateLogger()
        {
            return new DatabaseLogger();
        }
    }

配置檔案:

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

客戶端:

    internal class Program
    {
        static void Main(string[] args)
        {
            LoggerFactory factory;
            Logger logger;
            //讀取配置檔案
            string factoryType = ConfigurationManager.AppSettings["factoryType"];
            //用反射建立物件
            factory = Assembly.Load("FactoryMethodPattern").CreateInstance(factoryType) as LoggerFactory;
            logger = factory.CreateLogger();
            logger.WriteLog();
            Console.Read();
        }
    }

 

執行結果: