文章目录
- 抽象工厂模式
- 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
指定,这种扩展不太容易
当然,每一个东西有利必定有弊,我们在进行抽象工厂创建的时候,可以事先规划好这一批产品族的产品,防止后续再进行添加维护