使用场景

  • 所有工厂模式应用的前提:系统不要求依赖产品类实例如何被创建、组合和表达的表达。
  • 工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品。
  • 一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。

    • QQ 换皮肤,多个组件同时换。

      优缺点

  • 对组件的扩展不满足开闭原则,但这不是抽象工厂模式的核心。


    设计原理

    在抽象工厂中设定好公共的或核心的逻辑

  1. 在工厂方法模式的基础上创建多个工厂方法接口
  2. 在抽象工厂中建立不同工厂方法接口间的联系
  3. 将产品簇提供给调用者

    个人理解:

    初级理解

    多维工厂方法模式。即:工厂间有二维关联关系,如某个维度类似(品牌:OPPO ,VIVO)、另一个维度有一定的联系(组件:CPU、内存、显示屏)
    此时:当聚焦到品牌忽略组件时就是工厂方法模式,聚焦到组件时就是抽象工厂

    高级理解

    理解A

    单纯的多个工厂方法接口,那这样来说用工厂方法模式也没问题,因此关注点还是抽象类中已实现的逻辑可以用来干什么。

    理解B

    多个工厂方法间有相互依赖的公共逻辑

    理解C

    多个工厂方法间有公共的依赖细节,初始化公共log基类、SQL的链接字符串。
    总结:A没有必要,BC可独立可共存

类图

按个人理解此图不是工厂模式的核心,只是A模式的体现。
clipboard.png

角色

  • 抽象工厂(Abstract Factory)。 提供了创建产品的接口,它包含多个创建产品的方法newProduct(),可以创建多个不同等级的产品
    • 【手机工厂】
  • 具体工厂(Concrete Factory)。实现抽象工厂中的多个抽象方法,完成具体产品的创建
    • 【OPPO工厂、VIVO工厂、华为工厂】
  • 抽象产品(Product)定了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品.
    • 【CPU、内存、麦克风】【这里加产品抽象工厂需同步新增对应方法】
  • 具体产品(Concrete Product)实现了抽象产品角色多定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系
    • 【OPPO手机、VIVO手机】

实现方式

抽象工厂模式

实际应用

.NET类库中也存在应用抽象工厂模式的类

  1. /// 扮演抽象工厂的角色
  2. /// 创建连接数据库时所需要的对象集合,
  3. /// 这个对象集合包括有 DbConnection对象 DbCommand类、DbDataAdapter类,针对不同的具体工厂都需要实现该抽象类中方法,
  4. public abstract class DbProviderFactory
  5. {
  6. // 提供了创建具体产品的接口方法
  7. protected DbProviderFactory();
  8. public virtual DbCommand CreateCommand();
  9. public virtual DbCommandBuilder CreateCommandBuilder();
  10. public virtual DbConnection CreateConnection();
  11. public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
  12. public virtual DbDataAdapter CreateDataAdapter();
  13. public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
  14. public virtual DbParameter CreateParameter();
  15. public virtual CodeAccessPermission CreatePermission(PermissionState state);
  16. }

DbProviderFactory类是一个抽象工厂类,该类提供了创建数据库连接时所需要的对象集合的接口,实际创建的工作在其子类工厂中进行,微软使用的是SQL Server数据库,因此提供了连接SQL Server数据的具体工厂实现,具体代码可以用反编译工具查看,具体代码如下

  1. /// 扮演着具体工厂的角色,用来创建连接SQL Server数据所需要的对象
  2. public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
  3. {
  4. // Fields
  5. public static readonly SqlClientFactory Instance = new SqlClientFactory();
  6. // 构造函数
  7. private SqlClientFactory()
  8. {
  9. }
  10. // 重写抽象工厂中的方法
  11. public override DbCommand CreateCommand()
  12. { // 创建具体产品
  13. return new SqlCommand();
  14. }
  15. public override DbCommandBuilder CreateCommandBuilder()
  16. {
  17. return new SqlCommandBuilder();
  18. }
  19. public override DbConnection CreateConnection()
  20. {
  21. return new SqlConnection();
  22. }
  23. public override DbConnectionStringBuilder CreateConnectionStringBuilder()
  24. {
  25. return new SqlConnectionStringBuilder();
  26. }
  27. public override DbDataAdapter CreateDataAdapter()
  28. {
  29. return new SqlDataAdapter();
  30. }
  31. public override DbDataSourceEnumerator CreateDataSourceEnumerator()
  32. {
  33. return SqlDataSourceEnumerator.Instance;
  34. }
  35. public override DbParameter CreateParameter()
  36. {
  37. return new SqlParameter();
  38. }
  39. public override CodeAccessPermission CreatePermission(PermissionState state)
  40. {
  41. return new SqlClientPermission(state);
  42. }
  43. }

参考文档