🚀24个C#设计模式目录    🍺源码地址

概述

在工厂方法模式中,每个具体工厂都可以提供一个具体从产品,而在抽象工厂模式中,每个具体工厂提供的则是一个产品族

抽象工厂模式: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

使用频率:★★★★★

结构与实现

这里举一个新的🌰。在今天的操作系统中,黑暗模式(Dark Mode)是一个常见的功能,就像本博客提供的一样,可以在浅色和深色主题间进行切换:

浅色主题 深色主题
按钮
文本框
复选框

除了按钮以外,还有文本框、复选框等等,组成了整个主题的皮肤库。在这个例子中,浅色按钮、浅色文本框、浅色复选框等等组成一个产品族,而浅色主题工厂负责生产这一系列产品

抽象工厂模式中角色与工厂方法模式基本一致:

  • AbstractFactory (抽象工厂角色)
  • ConcreteFactory (具体工厂角色)
  • AbstractProduct (抽象产品角色)
  • ConcreteProduct (具体产品角色)

区别主要在于具体工厂角色抽象工厂角色职责,在工厂方法模式中,每个具体工厂都可以提供一个具体的产品,而在抽象工厂模式中,每个具体工厂提供的则是一个产品族

1
2
3
4
5
6
interface ThemeFactory
{
public Button CreateButton();
public TextField CreateTextField();
public CheckBox CreateCheckBox();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class LightThemeFactory : ThemeFactory
{
public Button CreateButton()
{
return new LightButton();
}

public CheckBox CreateCheckBox()
{
return new LightCheckBox();
}

public TextField CreateTextField()
{
return new LightTextField();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class DarkThemeFactory : ThemeFactory
{

public Button CreateButton()
{
return new DarkButton();
}

public CheckBox CreateCheckBox()
{
return new DarkCheckBox();
}

public TextField CreateTextField()
{
return new DarkTextField();
}
}

在客户端调用时,只需要指定具体工厂,就可以带来整个产品族

1
2
3
4
5
6
7
8
9
10
11
static void Main(string[] args)
{
ThemeFactory themeFactory = new LightThemeFactory();
//ThemeFactory themeFactory = new DarkThemeFactory();
Button button = themeFactory.CreateButton();
TextField textField = themeFactory.CreateTextField();
CheckBox checkBox = themeFactory.CreateCheckBox();
button.Display();
textField.Display();
checkBox.Display();
}

在此模式下,如果我们需要新增一个主题,比如“高对比度主题”或“护眼主题”,则只需要增加相应的具体产品角色和具体工厂角色,无需修改现有代码,很好的符合了开闭原则。但是如果需要增加新的抽象产品,比如“下拉菜单”、“日期选择控件”时,就需要修改所有工厂角色,违背了开闭原则。这就是抽象工厂模式存在的开闭原则的倾斜性

优缺点

优点:

  1. 抽象工厂模式隔离了具体类的生成,更换一个工厂变得相对容易。
  2. 当一个产品族中的对各对象被设计成一起工作时,它能够保证客户端始终使用同一个产品族的对象。
  3. 增加新的产品族很方便,无须修改已有系统,符合开闭原则。

缺点:

  1. 增加新的抽象产品麻烦,需要对原有系统进行较大修改,违背开闭原则。

适用场景

  • 系统不依赖产品类实例如何被创建、组合和表达的细节。对象的创建和使用解耦。
  • 系统中有多于一个的产品族,但是每次只是用其中某一产品族。
  • 属于同一产品族的产品将在一起使用,这一约束在系统设计时有所体现。
  • 产品类型稳定,不会向系统中增加新的产品类型或删除已有产品类型。