📜  抽象工厂模式 (1)

📅  最后修改于: 2023-12-03 15:25:51.732000             🧑  作者: Mango

抽象工厂模式

简介

抽象工厂模式是一种通过对具体工厂的抽象使其能够创建一族产品的方法。抽象工厂模式与工厂方法模式的区别在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

意图

提供一个接口,使得该接口可以创建一系列具有相同共性的对象。

结构
  • AbstractFactory:抽象工厂,提供一系列创建抽象产品的接口。
  • ConcreteFactory:具体工厂,实现抽象工厂提供的创建产品的方法。
  • AbstractProduct:抽象产品,定义一系列产品的属性和行为。
  • ConcreteProduct:具体产品,实现抽象产品定义的属性和行为。
实现

下面是一个抽象工厂模式的示例代码:

// 抽象产品A
interface AbstractProductA {
    void show();
}
// 抽象产品B
interface AbstractProductB {
    void show();
}
// 具体产品A1
class ConcreteProductA1 implements AbstractProductA {
    @Override
    public void show() {
        System.out.println("具体产品A1");
    }
}
// 具体产品A2
class ConcreteProductA2 implements AbstractProductA {
    @Override
    public void show() {
        System.out.println("具体产品A2");
    }
}
// 具体产品B1
class ConcreteProductB1 implements AbstractProductB {
    @Override
    public void show() {
        System.out.println("具体产品B1");
    }
}
// 具体产品B2
class ConcreteProductB2 implements AbstractProductB {
    @Override
    public void show() {
        System.out.println("具体产品B2");
    }
}
// 抽象工厂
interface AbstractFactory {
    AbstractProductA createProductA();
    AbstractProductB createProductB();
}
// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }
    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}
// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }
    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        AbstractFactory factory1 = new ConcreteFactory1();
        factory1.createProductA().show();
        factory1.createProductB().show();

        AbstractFactory factory2 = new ConcreteFactory2();
        factory2.createProductA().show();
        factory2.createProductB().show();
    }
}
优缺点
优点
  • 抽象工厂模式具有良好的封装性,客户端只需要知道产品的抽象类型即可。
  • 抽象工厂模式能够保证同一产品族的产品在一起创建,这还能保证产品的生产的和使用环境的一致性。
  • 抽象工厂模式可以在工厂的基础上分离出产品类的实现,使其更容易增加新的产品。
缺点
  • 抽象工厂模式在增加新的产品族时,需要修改抽象工厂的接口,这将涉及到抽象工厂及其所有子类的修改。
  • 抽象工厂模式增加了系统的抽象性和复杂性,这可能会增加代码的阅读难度。