<设计模式> 工厂模式
创始人
2024-11-14 10:06:06
0

工厂模式

  • 模式介绍:将对象的创建过程封装在工厂类中,客户端代码只需要关心从工厂获取对象的过程,而不需要了解对象的创建细节。这样做的好处包括提高了代码的灵活性和可扩展性,降低了对象之间的耦合度。
  • 主要解决接口选择的问题。当我们需要在不同条件下创建不同实例时。通过让子类实现工厂接口,返回一个抽象的产品。
  • 关键代码:对象的创建过程在子类中实现。

工厂模式的分类

工厂模式通常分为三种类型:简单工厂模式(静态工厂模式)、工厂方法模式和抽象工厂模式。

  1. 简单工厂模式(Simple Factory Pattern)
    1)定义:简单工厂模式又称静态工厂方法模式,它由一个工厂类根据传入的参数决定创建哪一种产品类的实例。
    2)优点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品。
    3)缺点:工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都要受到影响;系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  2. 工厂方法模式(Factory Method Pattern)
    1)定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。
    2)优点:客户端不需要在代码中指定具体产品的类,只需要使用共同接口来操作实例;符合开闭原则,可以在不修改原有系统代码的情况下扩展新的产品类。
    3)缺点:每增加一个产品,就需要增加一个具体工厂类,增加了系统的复杂度。
  3. 抽象工厂模式(Abstract Factory Pattern)
    1)定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
    2)优点:可以在类的内部对产品族进行约束,使得产品族内的产品可以替换;增加新的产品族很方便,只需增加一个新的工厂类,符合开闭原则。
    3)缺点:难以支持新种类的产品,因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品种类,则需要对接口进行扩展,这会影响到已有的系统结构。

应用场景

  • 数据库连接:为不同的数据库类型创建具体的工厂类,实现相应的数据库连接方法。
  • UI控件:为不同的UI控件类型创建具体的工厂类,实现相应的控件创建方法。
  • 文件处理:为不同的文件类型创建具体的工厂类,实现相应的文件处理方法。
  • 日志记录:为不同的日志类型创建具体的工厂类,实现相应的日志记录方法。
  • 网络通信:为不同的网络协议类型创建具体的工厂类,实现相应的网络通信方法。
  • 消息队列:为不同的消息队列类型创建具体的工厂类,实现相应的消息队列处理方法。
  • 数据结构:为不同的数据结构类型创建具体的工厂类,实现相应的数据结构操作方法。
  • 加密解密:为不同的加密解密算法类型创建具体的工厂类,实现相应的加密解密方法。
  • 消息推送:为不同的消息推送服务类型创建具体的工厂类,实现相应的推送方法。
  • 任务调度:为不同的任务调度服务类型创建具体的工厂类,实现相应的调度方法。

代码实现(AI Code)

一、简单工厂模式

///  /// 日志记录器的接口 ///  public interface ILogger   {       void Log(string message);   }  ///  /// ConsoleLogger实现日志记录器的接口 ///  public class ConsoleLogger : ILogger   {       public void Log(string message)       {           Console.WriteLine($"ConsoleLogger: {message}");       }   }      ///  /// FileLogger实现日志记录器的接口 ///  public class FileLogger : ILogger   {       private string filePath;          public FileLogger(string filePath)       {           this.filePath = filePath;       }          public void Log(string message)       {           // 这里简单模拟写入文件           Console.WriteLine($"FileLogger ({filePath}): {message}");           // 实际使用中,你可能需要在这里写文件       }   }  ///  /// 日志记录器工厂 ///  public class LoggerFactory   {       public static ILogger CreateLogger(string type)       {           switch (type)           {               case "console":                   return new ConsoleLogger();               case "file":                   // 假设我们默认日志路径为"app.log"                   return new FileLogger("app.log");               default:                   throw new ArgumentException("Invalid logger type");           }       }   }  class Program   {       static void Main(string[] args)       {           ILogger logger1 = LoggerFactory.CreateLogger("console");           logger1.Log("This is a console log.");              ILogger logger2 = LoggerFactory.CreateLogger("file");           logger2.Log("This is a file log.");              // 如果尝试创建一个不存在的日志类型,将抛出异常           // ILogger logger3 = LoggerFactory.CreateLogger("unknown");           // logger3.Log("This will not work.");       }   } 

二、工厂模式

// 日志记录器接口   public interface ILogger   {       void Log(string message);   }      // 控制台日志记录器   public class ConsoleLogger : ILogger   {       public void Log(string message)       {           Console.WriteLine($"Console: {message}");       }   }      // 文件日志记录器   public class FileLogger : ILogger   {       private readonly string filePath;          public FileLogger(string filePath)       {           this.filePath = filePath;       }          public void Log(string message)       {           // 假设只是打印到控制台,实际应写入文件           Console.WriteLine($"File ({filePath}): {message}");       }   }      // 日志工厂基类   public abstract class LoggerFactory   {       // 工厂方法       public abstract ILogger CreateLogger();   }      // 控制台日志工厂   public class ConsoleLoggerFactory : LoggerFactory   {       public override ILogger CreateLogger()       {           return new ConsoleLogger();       }   }      // 文件日志工厂   public class FileLoggerFactory : LoggerFactory   {       private readonly string filePath;          public FileLoggerFactory(string filePath)       {           this.filePath = filePath;       }          public override ILogger CreateLogger()       {           return new FileLogger(filePath);       }   }      // 使用示例   class Program   {       static void Main(string[] args)       {           LoggerFactory consoleFactory = new ConsoleLoggerFactory();           ILogger consoleLogger = consoleFactory.CreateLogger();           consoleLogger.Log("This is a console log.");              LoggerFactory fileFactory = new FileLoggerFactory("app.log");           ILogger fileLogger = fileFactory.CreateLogger();           fileLogger.Log("This is a file log.");       }   } 

三、抽象工厂模式

  1. 定义产品接口
/ 日志记录器接口   public interface ILogger   {       void Log(string message);   }      // 日志级别管理器接口(这里不实现具体类,仅作为示例)   public interface ILogLevelManager   {       // 可能包含设置日志级别、获取当前日志级别等方法   } 
  1. 创建具体产品类
// 控制台日志记录器   public class ConsoleLogger : ILogger   {       public void Log(string message)       {           Console.WriteLine($"Console: {message}");       }   }      // 文件日志记录器   public class FileLogger : ILogger   {       private readonly string filePath;          public FileLogger(string filePath)       {           this.filePath = filePath;       }          public void Log(string message)       {           // 假设只是打印到控制台,实际应写入文件           Console.WriteLine($"File ({filePath}): {message}");       }   } 
  1. 定义抽象工厂接口
// 抽象工厂接口   public interface ILoggingFactory   {       ILogger CreateLogger();       // 如果需要,可以添加ILogLevelManager CreateLogLevelManager();   } 
  1. 创建具体工厂类
// 控制台日志工厂   public class ConsoleLoggingFactory : ILoggingFactory   {       public ILogger CreateLogger()       {           return new ConsoleLogger();       }          // 如果需要日志级别管理器,则在这里实现       // public ILogLevelManager CreateLogLevelManager() { ... }   }      // 文件日志工厂   public class FileLoggingFactory : ILoggingFactory   {       private readonly string filePath;          public FileLoggingFactory(string filePath)       {           this.filePath = filePath;       }          public ILogger CreateLogger()       {           return new FileLogger(filePath);       }          // 如果需要日志级别管理器,则在这里实现,并可能依赖filePath       // public ILogLevelManager CreateLogLevelManager() { ... }   } 
  1. 使用抽象工厂
class Program   {       static void Main(string[] args)       {           ILoggingFactory consoleFactory = new ConsoleLoggingFactory();           ILogger consoleLogger = consoleFactory.CreateLogger();           consoleLogger.Log("This is a console log.");              ILoggingFactory fileFactory = new FileLoggingFactory("app.log");           ILogger fileLogger = fileFactory.CreateLogger();           fileLogger.Log("This is a file log.");       }   } 

相关内容

热门资讯

ia攻略/牛牛房卡代理九酷大厅... 今 日消息,九酷大厅/随意玩房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
我来教你/金花房卡专卖店新超圣... 新超圣房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根据...
正规平台有哪些,牛牛房卡怎么获... 微信游戏中心:青鸟大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
一分钟实测分享”热玩吧房卡怎么... 一分钟实测分享”热玩吧房卡怎么弄“牛牛房卡哪里有卖游戏中心打开微信,添加客服【113857776】,...
一分钟了解“如何购买金花房卡普... 悠悠大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡...
IA解析/斗牛房卡充值天道联盟... IA解析/斗牛房卡充值天道联盟/随意玩/房卡怎么买Sa9Ix苹果iPhone 17手机即将进入量产阶...
我来教你/牛牛充值房卡新竹大厅... 今 日消息,新竹大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
玩家攻略”王者大厅房卡“牛牛房... 玩家攻略”王者大厅房卡“牛牛房卡哪里有卖 微信牛牛房卡客服微信号微信游戏中心打开微信,添加客服【11...
推荐一款!牛牛房卡代理天蝎大厅... 微信游戏中心:天蝎大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
重大通报,金花充值房卡星驰娱乐... 星驰娱乐是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
科技实测!金花房卡出售新二号/... 您好!微信新二号大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(新二号)大厅介绍:咨询...
终于找到“微信斗牛房卡如何购买... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
重大通报,金花房卡是正规的新道... 今 日消息,新道游/新皇豪房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新...
一秒了解”百万牛房卡获取“哪里... 房卡获取是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:113857776许多玩家在游戏中会购买房卡...
我来教你/斗牛房间怎么创建的南... 南瓜大厅/新道游房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 ...
重大通报,牛牛房卡制作链接新众... 微信游戏中心:新众亿/皇豪互娱房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
ia实测“微信链接斗牛房卡多少... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
正版授权!金花房卡专卖店鲨鱼众... 您好!微信鲨鱼众娱大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(鲨鱼众娱)大厅介绍:...
实测分享”辣椒互娱房卡详细充值... 实测分享”辣椒互娱房卡详细充值“牛牛房卡批发平台游戏中心打开微信,添加客服【113857776】,进...
IA解析/牛牛房卡怎么获得天酷... 天酷大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...