工厂模式通常分为三种类型:简单工厂模式(静态工厂模式)、工厂方法模式和抽象工厂模式。
/// /// 日志记录器的接口 /// 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."); } }
/ 日志记录器接口 public interface ILogger { void Log(string message); } // 日志级别管理器接口(这里不实现具体类,仅作为示例) public interface ILogLevelManager { // 可能包含设置日志级别、获取当前日志级别等方法 }
// 控制台日志记录器 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 interface ILoggingFactory { ILogger CreateLogger(); // 如果需要,可以添加ILogLevelManager CreateLogLevelManager(); }
// 控制台日志工厂 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() { ... } }
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."); } }
上一篇:Rust的运行时多态