設計模式之:工廠方法模式FactoryMethodPattern的實現
阿新 • • 發佈:2022-04-02
本例用到了配置檔案、介面、反射、多型;
滿足的設計原則:
- 通過工廠,實現建立物件和使用物件的分離,實現鬆耦合,滿足迪米特法則;
- 通過配置檔案指定建立物件型別,而不需更改原始碼,滿足開閉原則;
- 容易實現功能擴充套件,只需新增新的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();
}
}
執行結果: