结合案例写出工厂方法模式实例

一、基本概念

工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中

或者说引入工厂模式的目的就是我们需要多个工厂,但是每个工厂内部又要划分情况,如果只用一个工厂的话,会产生多种复合的情况。

比如说我们有两个工厂,每个工厂有3种情况,如果用简单工厂模式,要分为 3 * 2 = 6种情况,所以可以用工厂方法模式解决。

二、结构

在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由大工厂的子类(或者实现类)来创建对象。

即上面有一个大工厂,下面是分类的工厂。

三、案例

案例,模拟需要生成中国食物A,中国食物B,美国食物A,美国食物B。

代码逻辑结构图:

基本结构图:

先给出这些食物(Product):

public interface Food {
}

public class AmericanFoodA implements Food {
}

public class AmericanFoodB implements Food {
}

public class ChineseFoodA implements Food {
}

public class ChineseFoodB implements Food {
}

然后是抽象工厂:

public interface FoodFactory {
    Food makeFood(String name);
}

然后就是两个子工厂:

public class ChineseFoodFactory implements FoodFactory {
    @Override
    public Food makeFood(String name) {
        if (name.equals("A")) {
            return new ChineseFoodA();
        } else if (name.equals("B")) {
            return new ChineseFoodB();
        } else {
            return null;
        }
    }
}
public class AmericanFoodFactory implements FoodFactory {
    @Override
    public Food makeFood(String name) {
        if (name.equals("A")) {
            return new AmericanFoodA();
        } else if (name.equals("B")) {
            return new AmericanFoodB();
        } else {
            return null;
        }
    }
}

最后测试:

public class MyTest {
    public static void main(String[] args) {
        // 先选择一个具体的工厂
        FoodFactory factory = new ChineseFoodFactory();

        // 由第一步的工厂产生具体的对象,不同的工厂造出不一样的对象
        Food food = factory.makeFood("A"); //  chineseFood * A
    }
}

四、总结

工厂方法模式和简单工厂模式在结构上的不同很明显。

工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上

工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么不妨把抽象工厂类合并到具体工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改为静态方法,这时候就得到了简单工厂模式。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java程序猿部落

Java面试必问通信框架NIO,原理详解

新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的,弥补了原来的 I/O 的不足,提供了高速的、面向块的 I/O。

18420
来自专栏Jerry的SAP技术分享

Java实现的有道云笔记图片批量下载工具

作为一个程序员,当然要善于利用各种工具提高自己做事情的效率了。如果没有现成的工具,就得自己造。

14630
来自专栏Jerry的SAP技术分享

使用JDK自带的工具jstack找出造成运行程序死锁的原因

Java多线程编程也是Java面试中经常考察的内容。刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁(deadlock)的应用出来。如何分析造成J...

11530
来自专栏Jerry的SAP技术分享

SAP MES接收生产订单及工艺路线

什么是MES? MES全称Manufacturing Execution System Software,是一个使用数字化控制,监控和自动化制造流...

20030
来自专栏Jerry的SAP技术分享

一个具体的例子学习Java volatile关键字

相信大多数Java程序员都学习过volatile这个关键字的用法。百度百科上对volatile的定义:

9820
来自专栏Jerry的SAP技术分享

如何通过Java代码判断当前的环境是否支持JRE 9

JDK9已经出来有一段时间了,因此很多流行的Java应用纷纷增添了对JDK9乃至JDK10的支持,比如Tomcat。

6210
来自专栏Jerry的SAP技术分享

100行代码让您学会JavaScript原生的Proxy设计模式

面向对象设计里的设计模式之Proxy(代理)模式,相信很多朋友已经很熟悉了。比如我之前写过代理模式在Java中实现的两篇文章:

7630
来自专栏Jerry的SAP技术分享

编程面试题:编写一个会造成数据库死锁的应用

相信对于”开发一个会产生死锁的Java应用”这类需求,大家都能顺利完成。但是如果题目要求得更具体一些,要求这个死锁发生在数据库层面,应该怎样完成呢?

10920
来自专栏Jerry的SAP技术分享

ABAP SICF服务和Java Servlet的比较

In my opinion ABAP ICF handler and Java Servlet play the same role in enhancemen...

12950
来自专栏Jerry的SAP技术分享

Docker技术三大要点:cgroup, namespace和unionFS的理解

从这张gif图片,我们不难看出Docker网站想传达这样一条信息, 使用Docker加速了build,ship和run的过程。

12140

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励