抽象工厂模式笔记

定义

之前已经写过工厂方法模式,其可以将创建对象的代码集中在一个对象或方法中,当增加产品时,只需要增加对应的产品和工厂类即可。但是其有一个问题是工厂的接口里只有一个创建抽象产品的方法,当我们想要在一个工厂里创建一系列的产品时,就需要使用抽象工厂模式。

使用

图看起来可能有点容易乱,其实主要有三个接口,两个产品的接口,每个产品接口有多个实现类

同时有一个工厂类,工厂类中可以生成每种产品接口的一个实现类。

代码(Java)

产品组部分的代码如下:

// A产品接口
public interface ProductA {
    void method();
}
​
// A产品实现类A1
public class ProductA1 implements ProductA {
    @Override
    public void method() {
        System.out.println("This is ProductA1");
    }
}
​
// A产品实现类A2
public class ProductA2 implements ProductA {
    @Override
    public void method() {
        System.out.println("This is ProductA2");
    }
}
​
// B产品接口
public interface ProductB {
    void method();
}
​
// B产品实现类B1
public class ProductB1 implements ProductB {
    @Override
    public void method() {
        System.out.println("This is productB1");
    }
}
​
// B产品实现类B2
public class ProductB2 implements ProductB {
    @Override
    public void method() {
        System.out.println("This is productB2");
    }
}

工厂相关代码:

// 抽象工厂接口
public interface Factory {
    // 生成A类产品
    ProductA createProductA();
    // 生成B类产品
    ProductB createProductB();
}
​
// 抽象工厂实现类1,生产ProductA1和ProductB1
public class ConcreteFactory1 implements Factory {
    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }
​
    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}
​
// 抽象工厂实现类2,生产ProductA2和ProductB2
public class ConcreteFactory2 implements Factory {
    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }
​
    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

测试类如下:

public class Test {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory1(); // 使用具体工厂1
        ProductA productA = factory.createProductA();
        ProductB productB = factory.createProductB();
        productA.method(); // 输出:This is ProductA1
        productB.method(); // 输出:This is productB1
​
        factory = new ConcreteFactory2(); // 切换工厂,使用具体工厂2
        productA = factory.createProductA();
        productB = factory.createProductB();
        productA.method(); // 输出:This is ProductA2
        productB.method(); // 输出:This is productB2
    }
}

总结

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

有一个工厂抽象类或接口,多种产品抽象类或接口,每个具体工厂子类可以创建多种产品类。

原文地址:https://www.cnblogs.com/zawier/p/6900322.html