大话设计模式——2.简单工厂模式(Simple Factory Pattern)

news2024/10/7 12:29:18

定义:又称静态工厂方法,可以根据参数的不同返回不同类的实例,专门定义一个类(工厂类)来负责创建其他类的实例可通过类名直接调用,被创建的实例通常具有共同的父类。
UML图:
在这里插入图片描述
例子:
计算器中的加减乘除,可将不同的运算看成不同的对象,通过工厂类进行构建,传入你想创建的对象的运算符号。
基类:运算对象,确定运算参数和方法

public class Operation {

    private int numberA;

    private int numberB;

    /**
     * 计算数据结果,通用方法
     */
    public void count() {
    }

    public Operation() {
    }

    public Operation(int numberA, int numberB) {
        this.numberA = numberA;
        this.numberB = numberB;
    }

    public int getNumberA() {
        return numberA;
    }

    public void setNumberA(int numberA) {
        this.numberA = numberA;
    }

    public int getNumberB() {
        return numberB;
    }

    public void setNumberB(int numberB) {
        this.numberB = numberB;
    }
}

派生类:
加法运算对象继承基类

public class AddOperation extends Operation {

    @Override
    public void count() {
        System.out.println(this.getNumberA() + "+" + this.getNumberB() + "=" + (this.getNumberA() + this.getNumberB()));
    }
}

后续运算对象创建类似。

工厂对象创建:提供一个统一的静态方法,创建运算对象

public class OperationFactory {

    /**
     * 构建运算对象
     *
     * @param calSign
     * @return
     */
    public static Operation createOperation(String calSign) {
        Operation opr = null;
        switch (calSign){
            case "+":
                opr = new AddOperation();
                break;
            case "-":
                opr = new SubOperation();
                break;
            case "*":
                opr = new MutOperation();
                break;
            default:
                System.out.println("暂未设置该类型运算");
        }
        return opr;
    }
}

执行:

public static void main(String[] args) {
        Operation opr;
        try {
            // 加法运算
            opr = OperationFactory.createOperation("+");
            opr.setNumberA(10);
            opr.setNumberB(12);
            opr.count();

            // 减法运算
            opr = OperationFactory.createOperation("-");
            opr.setNumberA(10);
            opr.setNumberB(12);
            opr.count();

            // 乘法运算
            opr = OperationFactory.createOperation("*");
            opr.setNumberA(10);
            opr.setNumberB(12);
            opr.count();

            // 除法运算
            opr = OperationFactory.createOperation("/");
            opr.setNumberA(10);
            opr.setNumberB(12);
            opr.count();
        } catch (NullPointerException ignored) {
        }
    }

在这里插入图片描述

总结:
优点:

  • 降低对象与业务之间的耦合性,隐藏对象的创建逻辑,使得对象与相关业务的修改较为容易。

缺点:

  • 违背开放-封闭原则,每新增一个业务便要修改工厂对象和创建新的对象
  • 增加了系统的复杂度和理解难度,不便于维护和扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据仓库选型建议

1 数仓分层 1.1 数仓分层的意义 **数据复用,减少重复开发:**规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。数据的逐层加工原则,下层包含了上层数据加工所需要的全量数据,这样的加工方…

SQL Developer 小贴士:显示RAC配置

前提: 已建立2节点RAC已在SQL Developer中建立了2个连接,分别到RAC的两个节点 然后单击菜单View>DBA,分别连接RAC节点1和节点2,并组织成目录(不必须,但建议)。 在两处可以体现为RAC配置。第…

python基础 | 模块与异常

1、模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句 模块让你能够有逻辑地组织你的 Python 代码段,不可能把代码写在一起 把相关的代码分配到一个模块里能让你的代码更好用&#…

Backtrader 量化回测实践(1)—— 架构理解和MACD/KDJ混合指标

Backtrader 量化回测实践(1)—— 架构理解和MACD/KDJ混合指标 按Backtrader的架构组织,整理了一个代码,包括了Backtrader所有的功能点,原来总是使用SMA最简单的指标,现在稍微增加了复杂性,用MA…

读写锁学习笔记

1、数据结构 读锁是共享模式,写锁是独占模式,两个锁也公用一个AQS 两者共用一个state来表示,state前16位表示读锁,后16位表示写锁 读锁操作 通过向右位移16位,然后进行操作 写锁操作 通过和0000 0000 0000 0000 111…

CheatEngine基础进阶篇

我们在上一篇文章里说了CE的安装,汉化以及最基础最基础的值扫描和修改方法,当然很多游戏不能通过这些简单的手段就能达到修改值的效果,因此我们还需要掌握以下几个重要的知识点: 指针寻址 上一步阐述了如何使用"代码查找"功能对付变化位置的数据地址,但这种方法…

【医学大模型 逻辑准确】PLPF:将医生诊断逻辑集成到大模型

PLPF:将医生诊断逻辑集成到大模型 提出背景规则建模偏好数据构建人类偏好对齐 实验结果不同模型对比论文复现 提出背景 论文:https://arxiv.org/pdf/2401.05695.pdf 起始问题: 如何提高大型语言模型(LLMs)在医疗对话生成中的逻辑…

docker (八)-dockerfile制作镜像

一 dockerfile dockerfile通常包含以下几个常用命令: FROM ubuntu:18.04 WORKDIR /app COPY . . RUN make . CMD python app.py EXPOSE 80 FROM 打包使用的基础镜像WORKDIR 相当于cd命令,进入工作目录COPY 将宿主机的文件复制到容器内RUN 打包时执…

CV论文--2024.2.21

source:CV论文--2024.2.21 1、Binary Opacity Grids: Capturing Fine Geometric Detail for Mesh-Based View Synthesis 中文标题:二元不透明度网格:捕获精细的几何细节以进行基于网格的视图合成 简介:尽管基于表面的视图合成算法由于其低计…

uni-app常用组件 App开发 小程序开发 这篇就够了

目录 一、uni-app官网网址 二、uni-app常用组件 1.视图容器 1.1 view 1.2 scroll-view 1.3 swiper 1.4 movable-area 1.5 movable-view 2.基础内容 2.1 icon 2.2 text 2.3 rich-text 3.表单组件 3.1 button 3.2 checkbox-group 3.3 form 3.4 input 3.5 label…

[经验] 什么是鄱阳湖旅游最主要的景点 #知识分享#知识分享

什么是鄱阳湖旅游最主要的景点 鄱阳湖是中国最大的淡水湖,位于江西省北部和湖南省南部。鄱阳湖旅游资源丰富,景色秀美,是游客游览江西最热门的旅游胜地之一。在所有的景点中,以下是鄱阳湖旅游中最主要的景点。 景点一&#xff1…

六西格玛培训对职场和财务的长期影响——张驰咨询

在当今竞争激烈的商业环境中,公司不断寻求提高质量和效率的方法,六西格玛(Six Sigma)作为一种旨在减少缺陷、提升产品和服务质量的管理策略,成为了很多企业的选择。然而,实施六西格玛需要专业的培训和认证&…

银河麒麟系列产品全新介绍——麒麟天御安全域管平台

麒麟天御安全域管平台是麒麟软件自主研发的新一代终端系统域管理平台,是专门针对银河麒麟操作系统环境下大规模的域用户和终端管理需求而设计。该平台聚焦用户身份验证、权限、访问控制、集中化管理、单点登录、策略等多个领域,提供组织管理、用户管理、终端管理、任务管理、软…

【python】windowslinux系统python的安装

一、python官网及下载路径 官网地址:Welcome to Python.org 下载路径:Download Python | Python.org ​​​​​​​ linux源码安装包下载: windows二进制安装包下载: 二、Linux如何安装python 2.1 单版本安装 以安装python…

防御保护---内容保护

文章目录 目录 文章目录 一.防火墙内容安全概述 二.深度识别技术(DFI/DPI) 深度包检测技术(DPI) 深度流检测技术(DFI) 两者区别 三.入侵防御IPS 一.防火墙内容安全概述 防火墙内容安全是防火墙的一个重…

即时设计和sketch对比

在设计领域,有很多易于使用的设计软件,每个软件都有自己的特点,但在使用中也会有一些限制。例如,传统的Sketch。Sketch是一款古老的UI设计软件。自2010年推出以来,已有10多年的历史,但它始终仅限于MAC。到目…

java中实体pojo对于布尔类型属性命名尽量别以is开头,否则 fastjson可能会导致属性读取不到

假如我们有一个场景,就是需要将一个对象以字符串的形式,也就是jsonString存到一个地方,比如mysql,或者redis的String结构。现在有一个实体,我们自己创建的,叫做CusPojo.java 有两个属性是布尔类型的&#x…

微调实操三:人类反馈对语言模型进行强化学习(RLHF)

1、前言 前面我们在《微调实操一: 增量预训练(Pretraining)》和《微调实操二: 有监督微调(Supervised Finetuning)》实操的两个章节,学习了PT(Continue PreTraining)增量预训练和SFT(Supervised Fine-tuning)有监督微调过程,,今天我们进入第三阶段的微调…

【微服务生态】Docker

文章目录 一、基础篇1. 简介2. 下载与安装3. 常用命令3.1 帮助启动类3.2 镜像命令3.3 容器命令 4. Docker 容器数据券5. Docker 镜像5.1 commit 生成镜像5.2 Docker Registry5.3 发布镜像 6. Docker 常规安装软件 二、高级篇1. Dockerfile1.1 概述1.2 基础知识1.3 Dockerfile常…

软件测试工程师经典面试题

软件测试工程师,和开发工程师相比起来,虽然前期可能不会太深,但是涉及的面还是比较广的。前期面试实习生或者一年左右的岗位,问的也主要是一些基础性的问题比较多。涉及的知识主要有MySQL数据库的使用、Linux操作系统的使用、软件…