自学内容网 自学内容网

抽象工厂模式和工厂模式的区别

1. 工厂模式(Factory Method Pattern)
工厂模式是为创建对象提供一个接口,让子类决定实例化哪一个类。工厂模式通过将实例化的过程延迟到子类,从而实现对象创建的灵活性。

  • 核心思想:定义一个创建对象的接口,但由子类来具体决定要实例化哪一个类。
  • 特点:关注的是“创建某一种类的对象”,它解决的是不同子类中如何实例化对象的细节问题。
结构:
  • 抽象工厂类:声明创建产品的方法。
  • 具体工厂类:实现创建产品的方法。
  • 产品接口:定义产品的共同接口。
  • 具体产品类:实现产品接口的具体类。
示例:
// 产品接口
interface Product {
    void use();
}

// 具体产品类
class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using Product A");
    }
}

// 具体产品类
class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using Product B");
    }
}

// 工厂接口
interface Factory {
    Product createProduct();
}

// 具体工厂类A
class FactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂类B
class FactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

在工厂模式中,每个具体工厂负责生产一种具体产品。你可以通过选择不同的工厂来创建不同的产品。


2. 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是一种更复杂的设计模式,它允许你创建一组相关的对象,而不是单个对象。抽象工厂提供一个接口,能够创建一系列相关或依赖的对象,而无需指定它们的具体类。

  • 核心思想:提供一个创建一组相关或相互依赖对象的接口,而无需指定具体类。
  • 特点:不仅能创建一个产品,还能创建一组产品,这组产品通常有某种关联或依赖关系
结构:
  • 抽象工厂接口:定义创建一组相关对象的方法。
  • 具体工厂类:实现创建具体产品的方法。
  • 抽象产品接口:为每个产品类提供接口。
  • 具体产品类:实现抽象产品接口的具体类。
示例:
// 抽象产品A接口
interface ProductA {
    void use();
}

// 抽象产品B接口
interface ProductB {
    void consume();
}

// 具体产品A1
class ConcreteProductA1 implements ProductA {
    @Override
    public void use() {
        System.out.println("Using Product A1");
    }
}

// 具体产品A2
class ConcreteProductA2 implements ProductA {
    @Override
    public void use() {
        System.out.println("Using Product A2");
    }
}

// 具体产品B1
class ConcreteProductB1 implements ProductB {
    @Override
    public void consume() {
        System.out.println("Consuming Product B1");
    }
}

// 具体产品B2
class ConcreteProductB2 implements ProductB {
    @Override
    public void consume() {
        System.out.println("Consuming Product B2");
    }
}

// 抽象工厂接口
interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}

在抽象工厂模式中,每个具体工厂负责生产一系列相关的产品(如 ProductAProductB),而不仅仅是单一的产品。


应用场景的不同

工厂模式的应用场景:
  • 当你只需要创建某一种产品的实例,而不需要创建其他类型的相关产品时。
  • 你希望由子类来决定实例化哪个具体产品。
  • 适合简单场景,如根据用户输入或配置文件决定创建哪种产品。
例子:
  • 文件解析器:根据文件类型(如 .txt, .pdf)来创建不同的解析器对象。
抽象工厂模式的应用场景:
  • 当你需要创建一组相互关联或相互依赖的对象时。
  • 系统的产品不仅仅是一个,而是一族产品,且系统需要避免产品之间的不兼容性。
  • 适合复杂场景,如产品系列需要一起工作或与其他产品协作。
例子:
  • 跨平台 UI 库:不同平台(如 Windows 和 macOS)需要一套相关联的 UI 组件(如按钮、菜单等)。抽象工厂可以为每个平台创建一组相关的 UI 组件。

总结:

  • 工厂模式适用于创建单一产品,关注的是如何创建一个对象。
  • 抽象工厂模式适用于创建一组相关产品,关注的是如何创建多个相关对象并保持其兼容性。

原文地址:https://blog.csdn.net/weixin_54574094/article/details/142468254

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!