一、定义

1. 产品族和产品等级的概念

(1)产品族:同一工厂下的不同产品;
(2)产品等级:不同工厂下的同一产品;
抽象工厂模式-LMLPHP

2. 定义

(1)为创建一组相关或相互依赖的对象提供一个接口,无须指定它们的具体类;
(2)抽象工厂模式是工厂方法模式的进一步抽象,抽象工厂方法模式针对的是一族产品,如果产品族中只有一种产品,则抽象工厂模式退化为工厂方法模式;

3. 抽象工厂模式涉及到的角色

(1)抽象工厂角色:抽象工厂模式的核心,与应用系统无关,任何创建对象的工厂必须实现这个接口;
(2)具体工厂角色:实现了抽象工厂接口,含有选择合适产品对象的逻辑,受到应用程序调用以创建产品对象;
(3)抽象产品角色:定义产品的共性;
(4)具体产品角色:实现抽象产品角色所声明的接口;

二、类图

抽象工厂模式-LMLPHP

三、代码实现

(一)产品角色

1、抽象产品角色A

package com.xiaobai.design_pattern.abstractfactory.productrole;

/**
 * @author wangtw
 * @ClassName ProductA
 * @description: 抽象工厂模式的抽象产品角色
 * @date 2023/11/2121:44
 */
public interface ProductA {

    void method();
}

2、具体产品角色A1

package com.xiaobai.design_pattern.abstractfactory.productrole;

/**
 * @author wangtw
 * @ClassName ProductA1
 * @description: 具体产品角色A1
 * @date 2023/11/2121:49
 */
public class ProductA1 implements ProductA{
    @Override
    public void method() {
        System.out.println("这是产品A1");
    }
}

3、具体产品角色A2

package com.xiaobai.design_pattern.abstractfactory.productrole;

/**
 * @author wangtw
 * @ClassName ProductA1
 * @description: 具体产品角色A2
 * @date 2023/11/2121:49
 */
public class ProductA2 implements ProductA{
    @Override
    public void method() {
        System.out.println("这是产品A2");
    }
}

4、抽象产品角色B

package com.xiaobai.design_pattern.abstractfactory.productrole;

/**
 * @author wangtw
 * @ClassName ProductA
 * @description: 抽象工厂模式的抽象产品角色
 * @date 2023/11/2121:44
 */
public interface ProductB {

    void method();
}

5、具体产品角色B1

package com.xiaobai.design_pattern.abstractfactory.productrole;

/**
 * @author wangtw
 * @ClassName ProductA1
 * @description: 具体产品角色B1
 * @date 2023/11/2121:49
 */
public class ProductB1 implements ProductB{
    @Override
    public void method() {
        System.out.println("这是产品B1");
    }
}

6、具体产品角色B2

package com.xiaobai.design_pattern.abstractfactory.productrole;

/**
 * @author wangtw
 * @ClassName ProductA1
 * @description: 具体产品角色B2
 * @date 2023/11/2121:49
 */
public class ProductB2 implements ProductB{
    @Override
    public void method() {
        System.out.println("这是产品B2");
    }
}

(二)工厂角色

1、抽象工厂角色

package com.xiaobai.design_pattern.abstractfactory.createrole;

import com.xiaobai.design_pattern.abstractfactory.productrole.ProductA;
import com.xiaobai.design_pattern.abstractfactory.productrole.ProductB;

/**
 * @author wangtw
 * @ClassName AbstractFactory
 * @description: 抽象工厂模式的抽象工厂角色
 * @date 2023/11/2121:43
 */
public interface AbstractFactory {

    /**
     * 创建产品A
     * @return
     */
    ProductA factoryA();

    /**
     * 创建产品B
     * @return
     */
    ProductB factoryB();
}

2、具体工厂角色1

package com.xiaobai.design_pattern.abstractfactory.createrole;

import com.xiaobai.design_pattern.abstractfactory.productrole.ProductA;
import com.xiaobai.design_pattern.abstractfactory.productrole.ProductA1;
import com.xiaobai.design_pattern.abstractfactory.productrole.ProductB;
import com.xiaobai.design_pattern.abstractfactory.productrole.ProductB1;

/**
 * @author wangtw
 * @ClassName ConcreteFactory1
 * @description: 具体工厂1
 * @date 2023/11/2121:55
 */
public class ConcreteFactory1 implements AbstractFactory{

    @Override
    public ProductA factoryA() {
        return new ProductA1();
    }

    @Override
    public ProductB factoryB() {
        return new ProductB1();
    }
}

3、具体工厂角色2

package com.xiaobai.design_pattern.abstractfactory.createrole;

import com.xiaobai.design_pattern.abstractfactory.productrole.*;

/**
 * @author wangtw
 * @ClassName ConcreteFactory1
 * @description: 具体工厂2
 * @date 2023/11/2121:55
 */
public class ConcreteFactory2 implements AbstractFactory{

    @Override
    public ProductA factoryA() {
        return new ProductA2();
    }

    @Override
    public ProductB factoryB() {
        return new ProductB2();
    }
}

(三)测试类

package com.xiaobai.design_pattern.abstractfactory;

import com.xiaobai.design_pattern.abstractfactory.createrole.AbstractFactory;
import com.xiaobai.design_pattern.abstractfactory.createrole.ConcreteFactory1;
import com.xiaobai.design_pattern.abstractfactory.createrole.ConcreteFactory2;
import com.xiaobai.design_pattern.abstractfactory.productrole.ProductA;
import com.xiaobai.design_pattern.abstractfactory.productrole.ProductB;
import org.junit.jupiter.api.Test;

/**
 * @author wangtw
 * @ClassName AbstractFactoryTest
 * @description: 抽象工厂模式测试类
 * @date 2023/11/2121:59
 */
public class AbstractFactoryTest {

    @Test
    public void test() {

        AbstractFactory factory1 = new ConcreteFactory1();
        ProductA productA1 = factory1.factoryA();
        ProductB productB1 = factory1.factoryB();
        productA1.method();
        productB1.method();

        AbstractFactory factory2 = new ConcreteFactory2();
        ProductA productA2 = factory2.factoryA();
        ProductB productB2 = factory2.factoryB();
        productA2.method();
        productB2.method();

    }
}

输出:

四、总结

1、抽象工厂模式优点
(1)不同工厂的各种产品可能具有不同的相互依赖关系,这些依赖关系对工厂的使用者不可见;
(2)如果要针对同一产品族建立新的生产线,只需要实现产品族的所有产品接口并新建新的工厂类即可;

抽象工厂模式-LMLPHP
2、抽象工厂模式的缺点
产品族扩展困难,如果需要在产品族中增加一个新产品类型,则需要修改多个接口,并且会影响已有的工厂类
参考:

11-22 03:01