设计模式入门:简单工厂模式

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 class CalculatorFactory {

    /**
     * 根据操作指令获取计算器操作对象
     *
     * @param type 操作指令
     * @return 具有某一功能的计算器
     */
    public static ICalculator calculate(TypeEnum type) {
        ICalculator calculator = null;
        switch (type) {
            case ADD:
                calculator = new CalculatorAdd();
                break;
            case SUB:
                calculator = new CalculatorSub();
                break;
            default:
                break;
        }
        return calculator;
    }

}
  • 客户端测试
public class CalculatorMain {

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

        // 从简单工厂获取任意拥有某一功能的计算器
        ICalculator calculate = CalculatorFactory.calculate(TypeEnum.ADD);
        if (Objects.nonNull(calculate)) {
            int result = calculate.compute(numberA, numberB);
            System.out.println("result = " + result);
        }
    }

}

总结思考

  简单工厂是一种创建型模式。根据开闭原则推导,在简单工厂模式应用中新增功能,需要添加相应的子类(对扩展开放,但同时也对修改开放了),并修改核心工厂类的相应方法(增加分支判断),具体的实例化延迟到了客户端进行选择,对于客户端来说,这去除了其与具体产品的直接依赖。

示例代码

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏做全栈攻城狮

Python学习入门教程,字符串函数扩充详解

因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数。本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)...

882
来自专栏北京马哥教育

grep、egrep正则表达式之初窥门径

何谓正则表达式 正则表达式,又称正规表示法、常规表示法 (Regular Expression,在代码中常简写为regex、regexp或RE),是一类字符所...

2198
来自专栏java一日一条

Java集合框架综述

近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们...

931
来自专栏编程

Python函数之匿名函数

各位小伙伴,周五快乐! 今天是2017年最后一个工作日,大家都在忙碌些什么呢? 今天我们要讲的是Python函数中的匿名函数 好像函数中的分类及说法很多,但是大...

2116
来自专栏软件开发 -- 分享 互助 成长

C++中关于指针初始化和使用NULL的理解

1、严禁使用未被初始化的指针:C++创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置。    (1)使用解除运算符(*)...

28810
来自专栏程序员互动联盟

java到底和C++有啥区别?

作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就是从C++衍生出来的。 然而,C++和...

3836
来自专栏IT派

JavaScript 打怪升级 —— 把业务逻辑当练习题做

开发项目和出没社区有一段时间了,会遇上一些比较有印象业务需求。这些业务需求,可能是自己开发项目遇上的,可能是在社区看到的业务需求,或者其他情况接触到的需求,但是...

823
来自专栏编程

让你比95%的人更懂Pythonic的内置模块:collections

Python的集合(collections)模块,为很多用其他方法很难实现的场景提供了解决方案。 本文我们将会学习该模块的抽象概念是如何产生的,日后处理不同问题...

2005
来自专栏java一日一条

Java集合框架综述

近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们...

1064
来自专栏小樱的经验随笔

数据结构学习笔记【持续更新】

数据结构概述:   定义:     我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到保存到主存储器(内存)中,     以及在此基础上为实...

2313

扫码关注云+社区

领取腾讯云代金券