设计模式 - 工厂模式
1.设计模式 - 工厂模式
2.设计模式 - 抽象工厂模式3.设计模式 - 单例模式4.设计模式 - 建造者模式5.设计模式 - 原型模式6.设计模式 - 适配器模式7.设计模式 - 桥接模式8.设计模式 - 组合模式9.设计模式 - 装饰模式10.设计模式 - 外观模式11.设计模式 - 享元模式12.设计模式 - 代理模式13.设计模式 - 责任链模式14.设计模式 - 命令模式15.设计模式 - 解释器模式16.设计模式 - 迭代器模式17.设计模式 - 中介者模式18.设计模式 - 备忘录模式19.设计模式 - 观察者模式20.设计模式 - 状态模式21.设计模式 - 策略模式22.设计模式 - 模板方法模式23.设计模式 - 访问者模式24.设计模式合集概述
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪一个类,从而将对象的创建过程与使用过程分离。这种模式提高了代码的灵活性和可维护性,广泛应用于需要灵活创建对象的场景。
结构
工厂方法模式包含以下几个角色:
- 抽象产品(Product):定义了产品的接口。
- 具体产品(ConcreteProduct):实现了抽象产品接口的具体类。
- 抽象工厂(Creator):声明了工厂方法,返回一个抽象产品类型的对象。
- 具体工厂(ConcreteCreator):实现了工厂方法,返回具体产品的实例。
示例代码
假设我们有一个应用程序需要创建不同类型的日志记录器(如文件日志记录器和数据库日志记录器)
代码地址
抽象产品
public interface ILogger
{
void Log(string message);
}
具体产品
public class FileLogger : ILogger
{
public void Log(string message)
{
// 将日志写入文件
Console.WriteLine($"FileLogger: {message}");
}
}
public class DatabaseLogger : ILogger
{
public void Log(string message)
{
// 将日志写入数据库
Console.WriteLine($"DatabaseLogger: {message}");
}
}
抽象工厂
public abstract class LoggerFactory
{
public abstract ILogger CreateLogger();
}
具体工厂
public class FileLoggerFactory : LoggerFactory
{
public override ILogger CreateLogger()
{
return new FileLogger();
}
}
public class DatabaseLoggerFactory : LoggerFactory
{
public override ILogger CreateLogger()
{
return new DatabaseLogger();
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
LoggerFactory factory;
ILogger logger;
// 创建文件日志记录器
factory = new FileLoggerFactory();
logger = factory.CreateLogger();
logger.Log("This is a file log message.");
// 创建数据库日志记录器
factory = new DatabaseLoggerFactory();
logger = factory.CreateLogger();
logger.Log("This is a database log message.");
}
}
应用场景
工厂方法模式适用于以下场景:
- 当一个类不知道它所需要的对象的类时。
- 当一个类希望由其子类来指定创建对象时。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化时。
优缺点
优点
- 提高代码的灵活性:通过将对象的创建过程延迟到子类,工厂方法模式使得代码更加灵活和可扩展。
- 降低耦合度:客户端代码不需要知道具体产品类的名称,只需要知道抽象产品接口,从而降低了代码的耦合度。
缺点
- 增加代码复杂性:每增加一个具体产品类,就需要增加一个相应的具体工厂类,导致代码量增加。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂