ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-31 15:03:52  阅读:229  来源: 互联网

标签:二十三 Food abstract public extends Vehicle 搞懂 设计模式 class


你好,我是小黄,一名独角兽企业的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开发工程师,有问题可以留言或者私信加我微信,我们下期再见

标签:二十三,Food,abstract,public,extends,Vehicle,搞懂,设计模式,class
来源: https://blog.csdn.net/qq_40915439/article/details/119275585

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有