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

你好,我是小黄,一名独角兽企业的Java开发工程师
校招收获数十个offer,年薪均20W~40W
感谢茫茫人海中我们能够相遇,
俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习,
希望优秀的你可以和我一起学习,一起努力,实现属于自己的梦想。
欢迎关注我的公众号:“爱敲代码的小黄”

文章目录

抽象工厂模式

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 指定,这种扩展不太容易

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

好了,本期的抽象工厂到这里就结束了

我是一名独角兽企业的Java开发工程师,有问题可以留言或者私信加我微信,我们下期再见

上一篇:在不同通信拓扑下的异构车辆的分布式预测控制


下一篇:工厂模式的一些思考