设计模式一之简单工厂模式

2023-11-19

生活示例

刻板印刷–>活字印刷举例:喝酒唱歌,人生真爽。–>对酒当歌,人生几何。
可维护:需要修改,则只需要改需要改的字即可。
可复用:字体可在后来的印刷复用。
可扩展:需要加字,只需要加入相应的刻字即可。
灵活性好:字的排列可能竖排或横排,只需要活字移动即可。

代码示例

需求

实现一个简易计算器功能。

UML

在这里插入图片描述

代码

package simpleFactory;

/**
 * Created by yutong on 2018/11/4
 * 工厂类
 */
public class OperationFactory {
    public static Operation createOperation(String operate){
        Operation oper = null;
        switch (operate){
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;
        }
        return  oper;
    }
}


package simpleFactory;

/**
 * Created by yutong on 2018/11/4
 * 运算类
 */
public class Operation {
      private double numA;
      private double numB;

    public double getNumA() {
        return numA;
    }

    public void setNumA(double numA) {
        this.numA = numA;
    }

    public double getNumB() {
        return numB;
    }

    public void setNumB(double numB) {
        this.numB = numB;
    }

    public double getResult() throws Exception {
        double result = 0;
        return result;
    }
}

package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 加法
 */
public class OperationAdd extends Operation {
    @Override
    public double getResult() {
        return getNumA() + getNumB();
    }
}
package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 减法
 */
public class OperationSub extends Operation{
    @Override
    public double getResult() {
        return getNumA() - getNumB();
    }
}

package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 乘法
 */
public class OperationMul extends Operation {
    @Override
    public double getResult() {
        return getNumA() * getNumB();
    }
}

package simpleFactory;
/**
 * Created by yutong on 2018/11/4
 * 除法
 */
public class OperationDiv extends Operation {
    @Override
    public double getResult() throws Exception {
        if (getNumB() == 0){
            throw new Exception("0不能做除数!");
        }
        return getNumA()/getNumB();
    }
}
package simpleFactory;
import java.util.Scanner;
/**
 * Created by yutong on 2018/11/4
 * 计算器client类
 */
public class Counter {
    public static void main(String[] args){
        try {
            System.out.println("======欢迎来到我的计算机世界=======");
            System.out.println("请输入您要计算的第一个数字:");
            Scanner scanner = new Scanner(System.in);
            String numA = scanner.next();
            System.out.println("请输入您要计算的第二个数字:");
            String numB = scanner.next();
            System.out.println("请输入运算符:");
            String oper = scanner.next();
            Operation operation = OperationFactory.createOperation(oper);
            operation.setNumA(Double.parseDouble(numA));
            operation.setNumB(Double.parseDouble(numB));
            System.out.println("计算结果为:"+operation.getResult());
        } catch (Exception e) {
            System.out.println("您输入有误"+e);
        }
    }
}

总结

代码是有艺术性的。将算法和界面解耦合(封装),将算法松耦合(继承&多态)。

简单工厂模式优缺点

优点:
使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性。

缺点:
可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,违背了开放封闭原则(ASD) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

使用场景

工厂类负责创建的对象比较少。
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式一之简单工厂模式 的相关文章

  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • Java中Gson、JsonElement、String比较

    好吧 我想知道这可能非常简单和愚蠢 但在与这种情况作斗争一段时间后 我不知道发生了什么 我正在使用 Gson 来处理一些 JSON 元素 在我的代码中的某个位置 我将 JsonObject 的 JsonElements 之一作为字符串获取
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样

随机推荐

  • FPGM(Filter Pruning via Geometric Median)笔记

    原文地址 文章目录 1 创新点 2 解决了哪些问题 3 原理和算法流程 1 创新点 提出了一种新的过滤器剪枝方法 即通过几何中值的过滤器剪枝 FPGM 来压缩模型 与以前的方法不同 FPGM 通过修剪带有冗余信息的过滤器而不是那些重要性 相
  • docker 指定不同容器使用同一个网段

    问题描述 因为我使用了dockers compose 不同的服务在不同的docker compose文件中 所以当远程调用的时候出现了根据容器名访问失败的错误 基于此我准备在docker中创建一个network 然后让其他容器全都指定使用一
  • Faster Transformer

    背景 Transformer自2017年的 Attention is All you Need 提出以来 成为通用高效的特征提取器 虽然其在NLP TTS ASR CV等多个领域表现优异 但在推理部署阶段 其计算性能却存在巨大挑战 以BER
  • PyTorch学习日志_20201030_神经网络

    日期 2020 10 30 主题 PyTorch入门 内容 根据PyTorch官方教程文档 学习PyTorch中神经网络 包括 定义网络 损失函数 反向传播 更新权重 根据自己的理解和试验 为代码添加少量注解 具体代码如下 from fut
  • C++中 Map的了解与基本用法(代码演示+自我总结+map中一对多的用法)

    C 中 map的了解与基本用法 代码演示 一 map的基本认识 Map是STL的一个关联容器 它提供一对一 其中第一个可以称为关键字 每个关键字只能在map中出现一次 第二个可能称为该关键字的值 的数据处理能力 由于这个特性 它完成有可能在
  • Linux添加多个python / R kernel

    安装多个python kernel 激活想要添加的python环境 pip 安装配置 激活想要添加新kernel的环境 source activate pytorch pip install ipykernel python m ipyke
  • wordcloud安装板版本

    https www lfd uci edu gohlke pythonlibs wordcloud
  • jupyter notebook一直显示“内核正在启动,请等待”,或者内核启动失败

    在使用anaconda自带的工具jupyter notebook时 添加完虚拟环境的内核 在jupyter notebook中打开相应虚拟环境的编辑器时一直显示内核正在启动 请等待 即使等待很久之后 也是内核启动失败 该问题是笔者在安装py
  • 如何运营好一个自媒体账号?

    想要做自媒体赚钱 并不只是拍摄或剪辑好视频就可以了 还需要懂一些账号运营小技巧 如何运营呢 今天这期内容 大周就来分享几点干货 记得先点赞收藏起来 1 用户调查 我们做自媒体之前 要先做好用户调查 这样我们才能更好的获得精准流量 并推广自己
  • 全系光谱完整版

    宇宙射线也叫电磁波 其中包含 射线 X射线 紫外线 可见光 红外线 近红外 远红外 还有无线电和超声波 无线电波是振荡电路中自由电子作周期性的运动产生的 红外线 可见光 紫外线是原子外层电子受激发产生的 X射线是原子内层电子受激发产生的 射
  • java中函数和数组

    函 数 为了提高代码的复用性 可以将其定义成一个单独的功能 该功能的体现就是java中的函数 函数就是体现之一 数 组 用于存储同一类型连续存放数据的一个容器 好处 可以对该容器中的数据进行编号 从0开始 数组用于封装数据 就是一个具体的实
  • C++中基本数据类型字节数及取值范围

    机器字长 是指计算机进行一次整数运算所能处理的二进制数据的位数 整数运算即定点整数运算 机器字长也就是运算器进行定点数运算的字长 通常也是CPU内部数据通路的宽度 现在一般为32位即4个字节 也有64位和16位的 算术类型的存储空间按照机器
  • 足部IMU在复杂场景中行走定位

    随着微机电系统 MEMS 技术的快速发展 基于MEMS的惯性导航系统 INS 在任意环境的基站定位方面发挥着至关重要的作用 惯性导航具有自主性强 定位频率高 功耗低 实时性强等特点 因此更适合单兵作战 反恐行动 应急救援 消防救援等环境未知
  • python模糊图像清晰化_Python图像处理介绍图像模糊与锐化

    欢迎关注 小白玩转Python 发现更多 有趣 引言 在之前的文章中 我们讨论了边缘检测内核 在本文我们将讨论如何在图像上应用模糊与锐化内核 将这些内核应用到彩色图像上 同时保留核心图像 一如既往 我们从导入所需的python库开始 imp
  • Flutter_点击事件及手势处理

    Flutter 点击事件和手势 Flutter中的手势系统有两个独立的层 第一层具有原始指针事件 其描述屏幕上指针 例如 触摸 鼠标和测针 的位置和移动 第二层具有手势 其描述由一个或多个指针移动组成的语义动作 指针 指针表示用户与设备屏幕
  • lede做无线打印服务器吗,OpenWrt/PandoraBox/LEDE做打印服务器连接HP1020问题汇总

    此解决方案适用于HP 1000 1005 1018 1020打印机 需要在路由器上面禁用双向模式 否则无法正常打印 问题一 能识别 能添加网络打印机 不能打印 下发打印任务之后 发现打印机根本没反应 Windows系统日志有报错Admini
  • Redis常见命令

    命令可以查看的文档 http doc redisfans com https redis io commands 官方文档 英文 http www redis cn commands html 中文 https redis com cn c
  • LoadRunner用户验证码和验证码使用脚本

    Action 定义Md5变量用来存放使用md5加密后的字符串 char Md5 33 存放包含用户登录信息的URL char str 174 存放用户账户信息 char str1 92 存放当前时间 int t1 int a char Me
  • 虚拟机重启网络失败service network restart

    某天早上发现网络突然重启失败 ping百度也出现未知网络 原因可能是NetworkManager和firewall 两个网络管理冲突 关掉NetworkManager即可 然后重启网络 解决 service NetworkManager s
  • 设计模式一之简单工厂模式

    生活示例 刻板印刷 gt 活字印刷举例 喝酒唱歌 人生真爽 gt 对酒当歌 人生几何 可维护 需要修改 则只需要改需要改的字即可 可复用 字体可在后来的印刷复用 可扩展 需要加字 只需要加入相应的刻字即可 灵活性好 字的排列可能竖排或横排