设计模式入门:工厂方法模式

UML类图

工厂方法模式

代码示例

  • 定义运算枚举
/**
 * 运算枚举
 */
public enum TypeEnum {

    /**
     * 加
     */
    ADD,

    /**
     * 减
     */
    SUB,;

}
  • 定义抽象产品类,包含一个抽象方法
/**
 * 抽象产品(计算器)
 */
public interface ICalculator {

    /**
     * 计算numberA和numberB并返回操作结果
     *
     * @param numberA
     * @param numberB
     * @return 操作结果
     */
    int compute(int numberA, int numberB);

}
  • 产品A,继承了抽象产品类并实现其定义的方法
/**
 * 具有加法运算功能的计算器
 */
public class CalculatorAdd implements ICalculator {

    /**
     * 将两个数进行加法运算
     *
     * @param numberA
     * @param numberB
     * @return 相加结果
     */
    @Override
    public int compute(int numberA, int numberB) {
        return numberA + numberB;
    }

}
  • 产品B,继承了抽象产品类并实现其定义的方法
/**
 * 具有减法运算功能的计算器
 */
public class CalculatorSub implements ICalculator {

    /**
     * 将两个数进行减法运算
     *
     * @param numberA
     * @param numberB
     * @return 相减结果
     */
    @Override
    public int compute(int numberA, int numberB) {
        return numberA - numberB;
    }

}
  • 抽象工厂,用于获取相应的产品
public interface ICalculatorFactory {

    /**
     * 获取生产某一功能的计算器工厂实例
     *
     * @return 返回生产某一功能计算器的工厂实例
     */
    ICalculator productCalculator();

}
  • 具体工厂A,实现了获取相关产品的功能
public class CalculatorAddFactory implements ICalculatorFactory {

    /**
     * 获取具有加法运算功能的计算器实例
     *
     * @return 返回当前实例
     */
    @Override
    public ICalculator productCalculator() {
        return new CalculatorAdd();
    }

}
  • 具体工厂B,实现了获取相关产品的功能
public class CalculatorSubFactory implements ICalculatorFactory {

    /**
     * 获取具有减法运算功能的计算器实例
     *
     * @return 返回当前实例
     */
    @Override
    public ICalculator productCalculator() {
        return new CalculatorSub();
    }

}
  • 客户端测试
public class CalculatorMain {

    public static void main(String[] args) {
        int numberA = 23;
        int numberB = 18;

        // 从抽象工厂获取生产某一功能计算器的工厂实例
        ICalculatorFactory calculatorFactory = new CalculatorSubFactory();
        // 从当前工厂获取制造某一功能的计算器实例
        ICalculator calculator = calculatorFactory.productCalculator();
        int result = calculator.compute(numberA, numberB);
        System.out.println("result = " + result);
    }

}

总结思考

  工厂方法同样也是一种创建型模式,是简单工厂模式的进一步抽象和推广。根据开闭原则,在工厂方法模式中新增功能,需要添加相应的功能类和工厂类(对扩展开放,对修改关闭),而具体的实例化则延迟到了工厂子类,并由客户端决定实例化哪一个工厂类。

  对比简单工厂,工厂方法把简单工厂内部的逻辑判断移动到了客户端,当添加功能时,原本是要改工厂类的,而现在是修改客户端。

示例代码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏liulun

nim的引用和指针

nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置 nim区分可被追踪的引用和不可被追踪的引用 ...

24650
来自专栏chafezhou

小说python中的迭代器(Iterator)

9920
来自专栏C/C++基础

C++构造函数和析构函数中抛出异常的注意事项

从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数和析构函数中尽量不要抛出异常,万不得已,一定要注意防止资源泄露。在析构函数中抛出...

11610
来自专栏恰童鞋骚年

《C#图解教程》读书笔记之四:类和继承

  (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义。

7240
来自专栏猿人谷

C++ 虚拟继承

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继 承自类A,因此在类D...

30280
来自专栏新智元

【Python大神秘籍Top10】这些窍门99%的人都不知道

【新智元导读】Python神奇方法是指一些允许在自定义类中增加“神奇”功能的方法。而在Python官方文档中,有关这些方法的介绍或描述不仅内容分散,而且组织结构...

16920
来自专栏技术专栏

基本排序算法

● 基础 ● 编码简单,易于实现,是一些简单情景的首选 ● 在一些特殊情况下,简单的排序算法更有效 ● 简单的排序算法思想衍生出复杂的排序算法 ● 作为...

8620
来自专栏xingoo, 一个梦想做发明家的程序员

图解闭包

说到 闭包 ,这是js不得不提的一个特性,很多传统语言都不具备这样的特性,比如JAVA C等等。 之前看书的时候,总是理解不好什么是闭包!下面就通过手绘一张...

23160
来自专栏Vamei实验室

Python基础10 反过头来看看

从最初的“Hello World”,走到面向对象。该回过头来看看,教程中是否遗漏了什么。 我们之前提到一句话,"Everything is Object". 那...

20190
来自专栏C/C++基础

C/C++ const

const是C语言的关键字,经C++扩充,功能变得强大,用法复杂。const用于定义一个常变量(只读变量)。当const与指针、引用、函数等结合起来使用时,情况...

12010

扫码关注云+社区

领取腾讯云代金券