面试官:工厂方法模式是什么?

33 阅读5分钟

真正的大师永远怀着一颗学徒的心
吃不了学习的苦就要吃生活的苦
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!回复【项目】有我为大家准备的一些项目源码。回复【简历模板】有我为大家准备的简历模板。

在这里插入图片描述


前言

今天的电子缝纫机厂依旧是热火朝天,小伙子们为了娶媳妇都干劲十足,把脚下的缝纫机踏板踩的直冒烟,就在我专心致志干活达到一种人机合一的状态时,突然厂房的门从外面推开了,来了一位新同事,本着不是自己的热闹就必须得看的原则,我和大家一样把目光缓缓的移向门口。

咦~,这人怎么看着这么眼熟呢?这不是网红电瓶哥吗,他怎么可能来打工呢。

在这里插入图片描述

趁中午吃饭之际,我找到电瓶哥。

我:“电瓶哥,你不是号称不可能打工的嘛,怎么也来这里打工了啊。”

电瓶哥:“我没有来打工啊,我是来干活的。”

我:“你特么的竟让我无言以对。。。是谁说通你来打工的呀,我挺好奇的。”

电瓶哥:“没有人劝我,是我看到了村口的广告,我准备挣钱找个婆娘。”

在这里插入图片描述

我:“这广告效果真不错呀,通俗易懂又有诱惑力。”

就在这时我的手机突然响了。

我:“喂,这又是谁啊!”

对方:“我,还是昨天给你打电话面试的,你现在方便吗,咱们再聊会。”

我:“方便,只要是上班时间接电话我都方便。”

一、面试

面试官:咱们今天来聊聊工厂方法模式吧,你说一说你对工厂方法模式的理解?

我:工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时还弥补了简单工厂模式的缺陷。

面试官:你能说说工厂方法模式比简单工厂模式好在哪里吗?

我:在工厂方法模式中我们工厂类中的逻辑是根据传进来的参数来进行对应的,就是如果你想买苹果了,那你在工厂类中就得有根据苹果参数生成苹果实例的判断逻辑,当你突然想吃菠萝了,如果工厂类中之前没有这一块的逻辑,你就得去工厂类中增加这一块的逻辑了,这样你就会频繁的修改工厂类中的代码,这样就不符合开闭原则了。

而工厂方法模式在工厂类和产品之间增加了一个具体工厂,我们具体的产品通过具体的工厂来生产,不需要修改工厂类中的逻辑。

例如我们之前是“真甜呀果园”,你想吃苹果了直接给我们厂里打电话我们就给你邮寄一箱苹果。但是我们现在业务扩展了,我们开始养家禽了,如果你想吃鸡也可以给我们打电话,但是这个时候还给“真甜呀果园”打电话就有点不合适了。

所以我现在成立了一个奇哥集团,你想吃什么直接给奇哥集团打电话就行,假如你想吃苹果,你就打电话给奇哥集团,然后奇哥集团给下属的“真甜呀果园”打电话给你邮寄一箱苹果,假如你想吃鸡,你也给奇哥集团打电话,然后奇哥给下属的“真香呀鸡圈”打电话给你邮寄一只鸡。

面试官:那你说一下工厂方法模式有哪些角色吧!

1、Product(抽象产品):他是定义产品的接口,他在这里相当于装水果的箱子,或者装鸡的笼子。

2、ConcreteProduct(具体产品):他实现了抽象产品接口,他在这里相当于苹果或者鸡。

3、Factory(抽象工厂):他在这里相当于奇哥集团,他用于接收客户的电话,然后给客户一箱水果或者一笼鸡。

4、ConcreteFactory(具体工厂):他在这里相当于“真甜呀果园”或者“真香呀鸡圈”,他负责接收集团的电话然后给集团相应的产品。

面试官:那你可以写一下具体的代码来描述一下工厂方法模式吗?

1、首先定义一个箱子接口,这个代表抽象产品角色

public interface Box {
    public void show();
}

2、然后定义一个苹果类,这个代表具体产品

public class Apple implements Box {
    @Override
    public void show() {
        System.out.println("买了一箱苹果");
    }
}

3、然后定义一个奇哥集团类,这个代表抽象工厂

public interface FactoryQG {
    public void show(String name); //抽象工厂方法
}

4、然后定义一个“真香呀”类,这个代表具体工厂

public class Zxy implements FactoryQG {
    Box box = null;
    @Override
    public void show(String name) {
        if(name.equals("苹果")){
            box = new Apple();
            box.show();
            System.out.println("真香呀果园苹果,50元一箱");
        }
    }
}

5、最后测试

public class Test {
    public static void main(String[] args) {
        FactoryQG factoryQG = new Zxy();
        factoryQG.show("苹果");
    }
}

在这里插入图片描述

通过上面的过程可以看出来,如果这个时候需要增加一个“鸡圈”,只需要增加一个具体工厂类即可,不需要修改抽象工厂类的代码,这样就符合对扩展开放,对修改关闭。

面试官:可以呀小伙子,什么时候有时间来公司入职呢?

我:再说吧,我先缝完手里这条秋裤再说。。。

二、总结

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧,另外可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!回复【项目】有我为大家准备的一些项目源码。回复【简历模板】有我为大家准备的简历模板。