简单工厂、工厂、抽象工厂模式

简单工厂、工厂、抽象工厂模式

      • [1. **简单工厂模式(Simple Factory)**](#1. 简单工厂模式(Simple Factory))
      • [2. **工厂方法模式(Factory Method)**](#2. 工厂方法模式(Factory Method))
      • [3. **抽象工厂模式(Abstract Factory)**](#3. 抽象工厂模式(Abstract Factory))
      • 对比总结

以下是三种工厂模式在C#中的实现与对比分析,结合具体代码示例说明:


1. 简单工厂模式(Simple Factory)

  • 核心:通过一个静态工厂方法根据参数返回不同产品实例。
  • C#示例(支付场景):
csharp 复制代码
// 抽象产品
public interface IPayment { void Pay(decimal amount); }

// 具体产品
public class Alipay : IPayment { public void Pay(decimal amount) => Console.WriteLine($"支付宝支付:{amount}元"); }
public class WeChatPay : IPayment { public void Pay(decimal amount) => Console.WriteLine($"微信支付:{amount}元"); }

// 工厂类
public class PaymentFactory {
    public static IPayment Create(string type) {
        return type switch {
            "alipay" => new Alipay(),
            "wechat" => new WeChatPay(),
            _ => throw new ArgumentException("不支持的支付方式")
        };
    }
}

// 客户端调用
var payment = PaymentFactory.Create("alipay");
payment.Pay(100);
  • 特点
    • ✅ 客户端与具体类解耦。
    • ❌ 新增支付方式需修改工厂类,违反开闭原则。

2. 工厂方法模式(Factory Method)

  • 核心:将对象创建延迟到子类,每个产品对应一个工厂。
  • C#示例(日志记录器场景):
csharp 复制代码
// 抽象产品
public interface ILogger { void Log(string message); }

// 具体产品
public class FileLogger : ILogger { public void Log(string message) => Console.WriteLine($"文件日志:{message}"); }
public class DatabaseLogger : ILogger { public void Log(string message) => Console.WriteLine($"数据库日志:{message}"); }

// 抽象工厂
public interface ILoggerFactory { ILogger CreateLogger(); }

// 具体工厂
public class FileLoggerFactory : ILoggerFactory {
    public ILogger CreateLogger() => new FileLogger();
}
public class DatabaseLoggerFactory : ILoggerFactory {
    public ILogger CreateLogger() => new DatabaseLogger();
}

// 客户端调用
ILoggerFactory factory = new FileLoggerFactory();
var logger = factory.CreateLogger();
logger.Log("测试日志");
  • 特点
    • ✅ 新增日志类型只需添加新工厂类,符合开闭原则。
    • ❌ 类数量随产品增加而增多。

3. 抽象工厂模式(Abstract Factory)

  • 核心:创建一组相关产品族(如跨平台UI组件)。
  • C#示例(UI组件场景):
csharp 复制代码
// 抽象产品族
public interface IButton { void Render(); }
public interface ITextBox { void Input(); }

// Windows产品族
public class WinButton : IButton { public void Render() => Console.WriteLine("Windows风格按钮"); }
public class WinTextBox : ITextBox { public void Input() => Console.WriteLine("Windows风格文本框输入"); }

// Mac产品族
public class MacButton : IButton { public void Render() => Console.WriteLine("Mac风格按钮"); }
public class MacTextBox : ITextBox { public void Input() => Console.WriteLine("Mac风格文本框输入"); }

// 抽象工厂
public interface IUIFactory {
    IButton CreateButton();
    ITextBox CreateTextBox();
}

// 具体工厂
public class WinUIFactory : IUIFactory {
    public IButton CreateButton() => new WinButton();
    public ITextBox CreateTextBox() => new WinTextBox();
}
public class MacUIFactory : IUIFactory {
    public IButton CreateButton() => new MacButton();
    public ITextBox CreateTextBox() => new MacTextBox();
}

// 客户端调用
IUIFactory factory = new WinUIFactory();
var button = factory.CreateButton();
button.Render();
  • 特点
    • ✅ 保证同一产品族的兼容性(如所有Windows组件风格一致)。
    • ❌ 扩展新产品类型(如ICheckbox)需修改所有工厂接口。

对比总结

维度 简单工厂 工厂方法 抽象工厂
创建目标 单一产品 单一产品 一组相关产品族
扩展性 需修改工厂类 新增工厂子类 新增产品族易,扩展产品类型难
适用场景 支付方式选择 日志记录器 跨平台UI套件

💡 演进逻辑

  • 简单工厂 → 工厂方法:解决开闭原则问题。
  • 工厂方法 → 抽象工厂:支持产品族创建。

引用链接:

1.深入解析工厂模式及其C#实现 - CSDN博客

2.c#简单工厂、工厂方法与抽象工厂的区别分析 - CSDN博客

3.C#设计模式教程(1):简单工厂模式 - CSDN下载

4.2-1 简单工厂模式(Simple Factory) - bravo1988

5.c#中工厂模式详解 - 博客园

6.《C#设计模式》 工厂三兄弟之 【简单工厂模式】,【工厂方法模式】,【抽象工厂模式】 - CSDN

7.C#设计模式(4)------抽象工厂模式 - CSDN

8.设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别 - 腾讯云

9.c#语法-47设计模式之简单工厂模式 - 哔哩哔哩

10.深入理解23种设计模式之五分钟学会工厂&抽象工厂模式 - 哔哩哔哩

11.工厂模式分为哪三种类型 - 资料速递员

12.简单工厂模式:创建型模式的轻量级实现 - 盖世傻白甜

13.工厂模式解析:三种模式的优缺点与使用场景 - 度小视

14.day09_03简单工厂和抽象工厂模式 - 哔哩哔哩

15.7、【设计模式】之3种工厂模式的优缺点,使用场景,以及代码示例。 - 哔哩哔哩

16.简单工厂模式解析与应用 - 度小视

17.工厂方法模式解析与应用 - 度小视

18.千锋java培训:Java设计模式视频教程-创建型模式-简单工厂模式 - 千锋教育

19.movin2333 - 博客园

20.C#设计模式之工厂模式的工厂方法 - 爱吃油麦菜

21.C#设计模式之工厂模式 - CSDN博客

22.C#中的工厂模式:实现与应用 - CSDN博客

23.C# 常用设计模式有哪些 - 博客园

24.C# 设计模式------简单工厂模式、工厂模式、抽象工厂模式 - 博客园

25.3种工厂模式!让代码更灵活🔥 - 晶影帧

26.长安红颜画赵阳 - 长安红颜画赵阳

27.c# 假设一个基类,有很多个子类,用工厂模式去控制生成方法合适吗? - 次元科技

相关推荐
积跬步至千里PRO6 天前
在 Java 中实现一个标准 Service 接口,并通过配置动态选择具体实现类供 Controller 调用
java·简单工厂模式·解耦
蔡蓝9 天前
设计模式-抽象工厂模式
设计模式·抽象工厂模式
胡侃有料9 天前
【设计模式】1.简单工厂、工厂、抽象工厂模式
设计模式·抽象工厂模式
周某某~9 天前
四.抽象工厂模式
java·设计模式·抽象工厂模式
摘星编程12 天前
抽象工厂模式深度解析:从原理到与应用实战
设计模式·抽象工厂模式·源码分析·软件架构·实战案例
摘星编程15 天前
工厂方法模式深度解析:从原理到应用实战
java·设计模式·软件工程·工厂方法模式
逆风飞翔i16 天前
简单工厂模式
c++·简单工厂模式
蔡蓝18 天前
设计模式-简单工厂模式
设计模式·简单工厂模式
QQ_hoverer18 天前
抽象工厂模式与策略模式结合使用小案例
抽象工厂模式·策略模式