设计模式--抽象工厂

简介

抽象工厂将工厂方法进一步抽象。定义了一个接口用于创建相关或有依赖关系的产品簇,而无需指明具体的类。可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展

工厂方法与抽象工厂方法的区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个

在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式

  • AbstractFactory:抽象工厂,定义创建系列产品对象的操作接口
  • ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现系列产品对象的创建
  • AbstractProduct产品对象接口
  • Product:实现产品对象接口的实现类

实现

  • 抽象产品接口
    • public interface AbstractProductA {
          void productA();
      }
    • public interface AbstractProductB {
          void productB();
      }
  • 抽象产品的实现子类
    • 抽象产品A的子类
      • public class ProductA1 implements AbstractProductA{
            @Override
            public void productA() {
                System.out.println("This is product A1");
            }
        }
      • public class ProductA2 implements AbstractProductA{
            @Override
            public void productA() {
                System.out.println("This is product A2");
            }
        }
    • 抽象产品B的子类
      • public class ProductB1 implements AbstractProductB{
            @Override
            public void productB() {
                System.out.println("This is product B1");
            }
        }
      • public class ProductB2 implements AbstractProductB{
            @Override
            public void productB() {
                System.out.println("This is product B2");
            }
        }
  • 抽象工厂接口
    • public interface AbstractFactory {
          AbstractProductA createProductA();
          AbstractProductB createProductB();
      }
  • 抽象工厂的子工厂
    • 子工厂1

      • public class ConcreteFactory1 implements AbstractFactory{
            @Override
            public AbstractProductA createProductA() {
                return new ProductA1();
            }
        
            @Override
            public AbstractProductB createProductB() {
                return new ProductB1();
            }
        }
    • 子工厂2
      • public class ConcreteFactory2 implements AbstractFactory{
            @Override
            public AbstractProductA createProductA() {
                return new ProductA2();
            }
        
            @Override
            public AbstractProductB createProductB() {
                return new ProductB2();
            }
        }
  • 测试
    • public class Test {
          public static void main(String[] args) {
              ConcreteFactory1 factory1 = new ConcreteFactory1();
              factory1.createProductA().productA();
              factory1.createProductB().productB();
          }
      }
      This is product A1
      This is product B1

优势和缺点

优势:抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理

缺点:假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的


应用场景

  • 系统中有多于一个的产品族,而每次只使用其中某一产品族
  • DAO层支持多种类型的数据库,动态切换时
  • 不同操作系统代码差异化,可以切换不同操作系统时

Java 中应用实例

核心 Java 程序库的一些示例

  • javax.xml.transform.TransformerFactory#newInstance()

识别方法 我们可以通过方法来识别该模式——其会返回一个工厂对象 接下来 工厂将被用于创建特定的子组件


参考

https://developer.aliyun.com/article/238431#slide-3

https://blog.csdn.net/daidaineteasy/article/details/81067627

posted @   伊文小哥  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示