云计算百科
云计算领域专业知识百科平台

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

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

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

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


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

  • 核心:通过一个静态工厂方法根据参数返回不同产品实例。
  • C#示例(支付场景):

// 抽象产品
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#示例(日志记录器场景):

// 抽象产品
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组件场景):

// 抽象产品族
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# 假设一个基类,有很多个子类,用工厂模式去控制生成方法合适吗? – 次元科技

赞(0)
未经允许不得转载:网硕互联帮助中心 » 简单工厂、工厂、抽象工厂模式
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!