抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。其结构图如下
在我看来,抽象工厂模式就是由多个有类似属性的简单工厂模式组合而成。所谓的抽象,我们是将他们的类似点进行抽象,然后使用的时候就可以依赖他们的抽象,而不是具体的实现类。
例如,如果我们程序访问数据库的话,那么通用的步骤有三步,分别是:
1、建立连接。
2、执行命令。
3、关闭连接
但是不同的数据库他们的连接建立关闭方式、命令执行方式都可能不同。这个时候我们可以将上图代入,ConcreteFactory1就可以是SqlServer相关对象的创建工厂,然后它创建ProductA1可能是建立连接所需要对象,ProductB1可能就是执行命令所需要对象。但实际上我们将他们的创建工厂,ProductA1、ProductB1都抽象出来,如果这个时候我们需要再添加一个MySQL的相关配置,那么我们只需要根据抽象去实现MySQL的相关配置就可以了,而不需要影响到已经存在的配置。
我们将他们的共性抽象出来,需要连接对象和命令对象。连接对象应该有建立连接和关闭连接的方法,命令对象应该有执行命令的方法

public interface IConnection { void Connection(); void Close(); } public interface ICommand { void Command(); }
那么我们如何获取到这两个对象呢,我们就应该有个工厂来帮我们创建

public interface IDatabaseUtils { IConnection GetConnection(); ICommand GetCommand(); }
如此我们要添加新的数据库配置就很简单了,只要对齐进行相关的实现就行了

public class SqlServerConnection : IConnection { public void Connection() { Console.WriteLine("SqlServer Connected ..."); } public void Close() { Console.WriteLine("SqlServer Connection Closed ..."); } } public class SqlServerCommand : ICommand { public void Command() { Console.WriteLine("SqlServer Command ..."); } } public class SqlServerUtils : IDatabaseUtils { public IConnection GetConnection() { return new SqlServerConnection(); } public ICommand GetCommand() { return new SqlServerCommand(); } }
然后我们在需要的地方使用它

static void Main(string[] args) { Console.WriteLine("Hello World!"); IDatabaseUtils databaseUtils = new SqlServerUtils(); //获取通用组件 IConnection connection = databaseUtils.GetConnection(); //拿到连接器 connection.Connection(); //建立连接 ICommand command = databaseUtils.GetCommand(); //获取命令发送器 command.Command(); //执行命令 connection.Close(); //关闭连接 }
如果我们再想添加MySQL相关的配置,那么我们再按照MySQL的相关配置将其实现以下就可以了。
在抽象工厂模式中,我们对工厂和产品都进行了抽象。然后他们的工厂的实现和产品的实现就可以看做一个简单工厂模式的实现。所以当程序需要处理不同系统的产品,并且不希望依赖于这些产品的具体类时,可以使用抽象工厂模式。它符合单一职责原则和开闭原则。