抽象工厂模式
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
即可
假如我当前需要增加一个食物为汉堡,只需要继承我们的 Food
即可
抽象工厂也存在一定的缺点,当我需要增加一个产品为爱好,需要创建该抽象类,并且在 AbstractFactory
指定,这种扩展不太容易
当然,每一个东西有利必定有弊,我们在进行抽象工厂创建的时候,可以事先规划好这一批产品族的产品,防止后续再进行添加维护
好了,本期的抽象工厂到这里就结束了