抽象工厂模式

1. 介绍

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

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

2. 实现

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

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

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

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

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

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

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

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

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

3.代码

架构图

在这里插入图片描述

代码

Weapon

public abstract class   {abstract void shoot();}

	AK47public class AK47 extends Weapon {...}
	Computerpublic class Computer extends Weapon {...}

Vehicle

public abstract class Vehicle {abstract void go();}

	BMWpublic class BMW extends Vehicle {...}
	SkateBoardpublic class SkateBoard extends Vehicle {...}

Food:

public abstract class Food {abstract void printName();}

	Breadpublic class Bread extends Food {...}
	StickCandypublic 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 指定,这种扩展不太容易

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

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值