设计模式之:工厂方法模式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(); } }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律