编辑
2025-09-28
C#
00

目录

摘要
正文
工厂方法模式定义
应用场景
优势与劣势
优势
劣势
示例

摘要

工厂方法模式是一种创建型设计模式,它提供了一种方式来封装对象的实例化过程。在工厂方法模式中,我们通过创建一个接口或抽象类来创建对象,然后让子类决定实例化哪一个类。

正文

工厂方法模式定义

工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

应用场景

工厂方法模式主要应用在以下几个场景:

  1. 当一个类不知道它所必须创建的对象的类的时候。
  2. 当一个类希望由它的子类来指定它所创建的对象的时候。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

优势与劣势

优势

  1. 你可以避免创建者和具体产品之间的紧密耦合。
  2. 单一职责原则。你可以将产品创建代码放在程序的单一位置,使得代码更易于维护。
  3. 开闭原则。你可以引入新的产品类型到程序中,而无需破坏现有的客户端代码。

劣势

  1. 由于代码使用了大量的新的类和接口,所以代码可能会变得更复杂。

示例

假设我们有一个日志记录器,它可以记录日志到不同的地方,比如文件或数据库。我们可以使用工厂方法模式来创建不同类型的日志记录器。

image.png

C#
/// <summary> /// 日志接口 /// </summary> public interface ILogger { void Log(string message); }
C#
/// <summary> /// 文件日志 /// </summary> public class FileLogger:ILogger { public void Log(string message) { //写文件 } }
C#
/// <summary> /// Db日志 /// </summary> public class DbLogger:ILogger { public void Log(string message) { //写日志到DB } }
C#
/// <summary> /// 抽象类 /// </summary> public abstract class LoggerFactory { //工厂抽像方法 public abstract ILogger CreateLogger(); public void Log(string message) { ILogger logger = CreateLogger(); logger.Log(message); } }
C#
/// <summary> /// 文件日志工厂类 /// </summary> public class FileLoggerFactory : LoggerFactory { public override ILogger CreateLogger() { return new FileLogger(); } }
C#
/// <summary> /// Db日志抽象类 /// </summary> public class DbLoggerFactory:LoggerFactory { public override ILogger CreateLogger() { //创建一个写Db日志类 return new DbLogger(); } }
C#
private void btnLogFile_Click(object sender, EventArgs e) { //文件日志 LoggerFactory logger=new FileLoggerFactory(); logger.Log("测试日志"); } private void btnLogDb_Click(object sender, EventArgs e) { //数据库志 LoggerFactory logger = new DbLoggerFactory(); logger.Log("测试日志"); }

LoggerFactory 是创建者,它定义了工厂方法 CreateLoggerFileLoggerFactoryDbLoggerFactory 是具体的创建者,它们实现了 CreateLogger 方法来创建 FileLoggerDbLoggerILogger 是产品,FileLoggerDbLogger 是具体的产品。

客户端代码只需要依赖 LoggerFactory,而无需知道具体的日志记录器是如何被创建的。

在这个例子中,如果我们想要改变日志记录器的类型,我们只需要改变 loggerFactory 的类型,而无需修改其他的代码。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!