文章目录

  • 抽象工厂模式
  • 1. 介绍
  • 2. 实现
  • 3. 代码
  • 4. 总结


抽象工厂模式

1. 介绍

意图:提供一个创建一系列相关或者依赖的接口,而无需指定他们具体的类

何时使用:系统的产品有多于一个产品族,而系统只消费其中某一族的产品,例子如下

当前有个换装游戏,进入不同的游戏场景需要选择不同的游戏套装,比如,正常的都市套装,里面包含的东西有:

  • 食物:面包
  • 武器:AK47
  • 车辆:宝马

这时候,一个吃着面包、拿着AK47、开着宝马的人物形象就跃然纸上,但是,当我们进入警察局时,如果我们的枪被警察看到,游戏将直接结束。

所以,我们需要进行一键换装,将我们的人物形象转换成吃着棒棒糖、拿着电脑、骑着滑板的形象,这样才可以进入警察局,完成我们的人物,接下来,我们来看下这种如何实现。

2. 实现

我们整体的结构图如下所示:

二十三天搞懂设计模式之抽象工厂模式_设计模式

我们将武器、食物、车辆封装成各自的抽象类,实现其不同的方法,如:AK47、Computer等

创建一个 AbstractFactory 的抽象工厂,用于生产一类产品族,生产武器、食物、车辆等

对于不同的场景,我们需要定制不同的工厂类

正常人的换装工厂,我们让其返回的是宝马、面包、AK47

警局的换装工厂,我们让其返回的是滑板、棒棒糖、电脑

main 中指定不同的换装工厂,即可完成该需求

3. 代码

  • Weapon:public abstract class Weapon {abstract void shoot();}
  • AK47:public class AK47 extends Weapon {...}
  • Computer:public class Computer extends Weapon {...}
  • Vehicle:public abstract class Vehicle {abstract void go();}
  • BMW:public class BMW extends Vehicle {...}
  • SkateBoard:public class SkateBoard extends Vehicle {...}
  • Food:public abstract class Food {abstract void printName();}
  • Bread:public class Bread extends Food {...}
  • StickCandy:public class StickCandy extends Food {...}
  • AbstractFactory
/**
 * 抽象工厂
 */
public abstract class AbstractFactory {
    abstract Food createFood();
    // 车辆
    abstract Vehicle createVehicle();
    // 武器
    abstract Weapon createWeapon();
}
  • CleverFactory
public class CleverFactory  extends AbstractFactory{
    @Override
    Food createFood() {
        return new StickCandy();
    }

    @Override
    Vehicle createVehicle() {
        return new SkateBoard();
    }

    @Override
    Weapon createWeapon() {
        return new Computer();
    }
}
  • ModerenFactory
public class ModerenFactory extends AbstractFactory {
    @Override
    Food createFood() {
        return new Bread();
    }

    @Override
    Vehicle createVehicle() {
        return new BMW();
    }

    @Override
    Weapon createWeapon() {
        return new AK47();
    }
}
  • 测试类
public class Main {
    public static void main(String[] args) {
        // 正常人走一段时间
        AbstractFactory abstractFactory = new ModerenFactory();
        // 进行赋值
        Vehicle vehicle = abstractFactory.createVehicle();
        Weapon weapon = abstractFactory.createWeapon();
        Food food = abstractFactory.createFood();
        // 走到警局,需要换装
        abstractFactory = new CleverFactory();
        // 进行赋值
        vehicle = abstractFactory.createVehicle();
        weapon = abstractFactory.createWeapon();
        food = abstractFactory.createFood();
    }
}

4. 总结

我们可以看到,通过以上的方式,我们可以瞬间完成服装的转换

我们在进行扩展的时候,也比较方便

假如我当前需要增加一个食物为汉堡,只需要继承我们的 Food 即可

抽象工厂也存在一定的缺点,当我需要增加一个产品为爱好,需要创建该抽象类,并且在 AbstractFactory 指定,这种扩展不太容易

当然,每一个东西有利必定有弊,我们在进行抽象工厂创建的时候,可以事先规划好这一批产品族的产品,防止后续再进行添加维护