编辑
2025-09-28
C#
00

目录

摘要
正文
应用场景
优势与劣势
优势
劣势
例子

摘要

抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在编程中,抽象工厂用于处理大量相关的依赖关系,而不需要指定它们具体的类。

正文

应用场景

抽象工厂模式通常适用于以下场景:

  • 当一个类需要其子类来指定创建对象时。
  • 当一个类希望由其子类来实现它的实例。
  • 当一个类不能预见它需要创建哪种类的对象。

优势与劣势

优势

  • 抽象工厂模式可以确保一个应用使用同一套产品,这使得产品之间的互操作性得以实现。
  • 抽象工厂模式可以避免客户端与具体产品类的耦合。
  • 你可以从具体工厂类中提取出其公共的代码。

劣势

  • 由于使用了大量的类和接口,代码可能会变得比较复杂。
  • 在产品族中增加新的产品是很困难的,它需要修改抽象工厂和所有的子工厂。

例子

C#
//接口IButton public interface IButton { string Paint(); }
C#
//接口ICheckBox public interface ICheckBox { string Paint(); }
C#
public class MacButton : IButton { public string Paint() { return "Mac 样式的Button"; } }
C#
public class MacCheckBox: ICheckBox { public string Paint() { return "Mac 样式的Checkbox"; } }
C#
public class WinButton : IButton { public string Paint() { return "Window 样式按钮"; } }
C#
public class WinCheckBox : ICheckBox { public string Paint() { return "Window 样式CheckBox"; } }
C#
// 抽象工厂 public interface IGUIFactory { IButton CreateButton(); ICheckBox CreateCheckBox(); }
C#
//Mac 具体工厂 internal class MacFactory : IGUIFactory { public IButton CreateButton() { return new MacButton(); } public ICheckBox CreateCheckBox() { return new MacCheckBox(); } }
C#
// Windows 具体工厂 internal class WinFactory : IGUIFactory { public IButton CreateButton() { return new WinButton(); } public ICheckBox CreateCheckBox() { return new WinCheckBox(); } }

界面开发

image.png

C#
private void btnMac_Click(object sender, EventArgs e) { //通过工厂创建了button与checkbox MacFactory factory=new MacFactory(); IButton button=factory.CreateButton(); ICheckBox checkBox=factory.CreateCheckBox(); MessageBox.Show(button.Paint()); MessageBox.Show(checkBox.Paint()); } private void btnWindows_Click(object sender, EventArgs e) { //通过工厂创建了button与checkbox WinFactory factory = new WinFactory(); IButton button = factory.CreateButton(); ICheckBox checkBox = factory.CreateCheckBox(); MessageBox.Show(button.Paint()); MessageBox.Show(checkBox.Paint()); }

IGUIFactory是抽象工厂,MacFactoryWinFactory是具体工厂,IButtonICheckBox是抽象产品,MacButtonMacCheckBoxWinButtonWinCheckBox是具体产品。

客户端代码选择并创建一个具体工厂,然后使用这个工厂创建产品。这样,客户端代码与具体产品类解耦,只依赖于抽象产品类和抽象工厂。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!