1. 介绍
意图:提供一个创建一系列相关或者依赖的接口,而无需指定他们具体的类
何时使用:系统的产品有多于一个产品族,而系统只消费其中某一族的产品
2. 实现
当前有个换装游戏,进入不同的游戏场景需要选择不同的游戏套装,比如,正常的都市套装,里面包含的东西有:
食物:面包
武器:AK47
车辆:宝马
这时候,一个吃着面包、拿着AK47、开着宝马的人物形象就跃然纸上,但是,当我们进入警察局时,如果我们的枪被警察看到,游戏将直接结束。
所以,我们需要进行一键换装,将我们的人物形象转换成吃着棒棒糖、拿着电脑、骑着滑板的形象,这样才可以进入警察局,完成我们的人物,接下来,我们来看下这种如何实现。
我们将武器、食物、车辆封装成各自的抽象类,实现其不同的方法,如:AK47、Computer等
创建一个 AbstractFactory 的抽象工厂,用于生产一类产品族,生产武器、食物、车辆等
对于不同的场景,我们需要定制不同的工厂类
正常人的换装工厂,我们让其返回的是宝马、面包、AK47
警局的换装工厂,我们让其返回的是滑板、棒棒糖、电脑
在 main 中指定不同的换装工厂,即可完成该需求
3.代码
架构图
代码
Weapon
public abstract class {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();
}
}
4.总结
我们可以看到,通过以上的方式,我们可以瞬间完成服装的转换
我们在进行扩展的时候,也比较方便
假如我当前需要增加一个食物为汉堡,只需要继承我们的 Food 即可
抽象工厂也存在一定的缺点,当我需要增加一个产品为爱好,需要创建该抽象类,并且在 AbstractFactory 指定,这种扩展不太容易
当然,每一个东西有利必定有弊,我们在进行抽象工厂创建的时候,可以事先规划好这一批产品族的产品,防止后续再进行添加维护