张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

设计模式之:工厂方法模式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();
}
}

 

运行结果:

posted on   张德长  阅读(170)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示