一. 定义

  • 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
  • 抽象工厂模式是工厂方法模式的泛华版,工厂方法模式是一种特殊的抽象工厂模式。在工厂方法模式中每个具体工厂只能生成一种具体产品,而在抽象工厂方法模式中,一个工厂可以生产多个具体产品。
  • 产品等级结构:即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视丶美的电视,则抽象电视和具体品牌的电视构成了一个产品等级结构。
  • 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器厂生产海尔电视机丶海尔洗衣机,海尔电视机位于电视机产品等级结构,海尔洗衣机位于洗衣机产品等级结构。

二. 模式结构

uTools_1687520963712.png

1. Product(抽象产品)

  • 产品接口

2. ConcreteProduct(具体产品)

  • 实现抽象产品,具体的创建对象

3. AbstractFactory(抽象工厂)

  • 工厂类的抽象父类,任何具体工厂都必须实现它, 可以定义一组方法,每个方法对应一个产品等级结构。

4. ConcreteFactory(具体工厂)

  • 抽象工厂的子类,返回具体产品类实例,所有产品等级结构构成产品族。

三. 实例

uTools_1687521732836.png

1. Factory/HaierFactory/MeDifactory

public interface Factory
{
    public TV createTV();
    public AC createAC();
}
public class HaierFactory implements Factory
{
    @Override
    public TV createTV() {
        System.out.println("海尔工厂生产海尔TV");
        return new HaierTV();
    }

    @Override
    public AC createAC() {
        System.out.println("海尔工厂生产海尔空调");
        return new HaierAC();
    }
}
public class MeiDiFactory implements Factory {
    @Override
    public TV createTV() {
        System.out.println("美的工厂生产美的TV");
        return new MeiDiTV();
    }

    @Override
    public AC createAC() {
        System.out.println("美的工厂生产美的空调");
        return new MeiDiAC();
    }
}

2. TV/HaierTV/MeiDiTV

public interface TV
{
    public void play();
}
public class HaierTV implements TV
{
    @Override
    public void play()
    {
        System.out.println("海尔TV播放中");
    }
}
public class MeiDiTV implements TV
{
    @Override
    public void play()
    {
        System.out.println("美的TV播放中");
    }
}

3. AC/HaierAC/MeiDiAC

public interface AC {
    public void play();
}
public class HaierAC implements AC{
    @Override
    public void play() {
        System.out.println("海尔空调正在制冷");
    }
}
public class MeiDiAC implements AC{
    @Override
    public void play() {
        System.out.println("美的空调正在制冷");
    }
}

4. client

public class Client
{
    public static void main(String[] args) throws Exception
    {
        HaierFactory haierFactory=new HaierFactory();
        HaierTV haierTV= (HaierTV) haierFactory.createTV();
        HaierAC haierAC= (HaierAC) haierFactory.createAC();
        haierTV.play();
        haierAC.play();

        MeiDiFactory meiDiFactory=new MeiDiFactory();
        MeiDiTV meiDiTV= (MeiDiTV) meiDiFactory.createTV();
        MeiDiAC meiDiAC= (MeiDiAC) meiDiFactory.createAC();
        meiDiTV.play();
        meiDiAC.play();
    }
}