当前位置: 首页 > news >正文

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

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);
    }

}

总结思考

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

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

示例代码

相关文章:

  • 作为app运营,你需要get的技能有哪些? 总结七项APP运营技能
  • Java分布式锁之数据库实现
  • Netty(二):数据在ChannelPipeline中的流经
  • 771. Jewels and Stones - LeetCode
  • 主磁盘分区和逻辑磁盘分区的区别是什么?
  • Android tab页制作
  • 纯前端表格技术应用研讨会——华为供应链专场
  • PHP运算优先级导致的and绕过
  • oracle查看某表字段类型
  • python 中的 %s%用法
  • 一些css基础学习笔记
  • android drawable drawable-xhdpi 细节
  • 比特币区块结构解析
  • 新版博客前端前瞻
  • 腾讯云如何快速从IPv4向IPv6演进?
  • Android开源项目规范总结
  • exports和module.exports
  • golang中接口赋值与方法集
  • Java的Interrupt与线程中断
  • Java新版本的开发已正式进入轨道,版本号18.3
  • node入门
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • 电商搜索引擎的架构设计和性能优化
  • 订阅Forge Viewer所有的事件
  • 回顾 Swift 多平台移植进度 #2
  • 警报:线上事故之CountDownLatch的威力
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • - 转 Ext2.0 form使用实例
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #pragma data_seg 共享数据区(转)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (42)STM32——LCD显示屏实验笔记
  • (LeetCode C++)盛最多水的容器
  • (多级缓存)多级缓存
  • (二)fiber的基本认识
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)库存超卖案例实战——优化redis分布式锁
  • (图)IntelliTrace Tools 跟踪云端程序
  • *** 2003
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .apk 成为历史!
  • .NET的微型Web框架 Nancy
  • [\u4e00-\u9fa5] //匹配中文字符
  • [] 与 [[]], -gt 与 > 的比较
  • []串口通信 零星笔记
  • [C# WPF] 如何给控件添加边框(Border)?
  • [C#] 如何调用Python脚本程序