java设计模式——简单工厂模式(Simple Factory Pattern)

2023-11-16

定义: 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工 厂模 式中,可以根据参数的不同返回不同类的实例。
结构:
  • Factory:工厂角色,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用, 创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。
  • Product:抽象产品角色,它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性, 使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
  • ProductA:具体产品角色,它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。 每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
具体结构图:
                             
工厂类:
public class Factory {
    public Product static createProduct(String type){
        switch (type){
            case "a":
                return new ProductA();
            case "b":
                return new ProductB();
            default:
                break;
        }
        return null;
    }
}
产品类:
public abstract class Product {
    public Product(){}
}
public class ProductA extends Product {
    public  ProductA(){
        System.out.print("create product a");
    }
}
public class ProductB extends Product {
    public ProductB(){
        System.out.print("create product b");
    }
}
客户端:
Product a = Factory.createProduct("a");
Product b = Factory.createProduct("b");
简单工厂模式的优点:
  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
  • 实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责。
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
简单工厂模式的缺点:
  • 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
  • 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  • 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
简单工厂模式适用环境:
  • 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java设计模式——简单工厂模式(Simple Factory Pattern) 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour

随机推荐

  • 【包真】我的第一次webpack优化,首屏渲染从9s到1s

    大家好 我是猫小白 本文基于vue2 全文阅读大约需要3分钟 谈到webpack优化大部分人可能都看腻了 无非就那几招嘛 我之前也是看过许多类似的文章 但都没有自己真正上手过 下面是我用公司的项目真实操练下来的 首屏加载速度提升很大 刷刷的
  • tf-idf+lda分析多篇文章摘要

    import pandas as pd import numpy as np import matplotlib pyplot as plt import seaborn as sns plt rcParams font sans seri
  • 最常见的8个Android内存泄漏问题及解决方法

    作者 午后一小憩 在 Android 开发中 内存泄漏是一个常见的问题 这个问题可能会导致应用程序变慢 崩溃或者消耗大量的内存 最终导致设备性能下降 什么是内存泄漏 内存泄漏指的是应用程序中存在一些对象或者资源无法被垃圾回收器回收 导致内存
  • Linux获取文件属性

    以 rw rw r 1 ubuntu ubuntu 56 八月 1 19 37 1 txt 为例 一 stat函数 功能 获取文件的属性 函数原型 include
  • 根据数据生成地图并着色

    前言 我们有时会拿到一些数据与国家或者地区密切相关 故在地图上将其可视化会更为直观 同时也会提高数据分析的效率 利用Map绘制地图 以世界地图为例 数据形式如下 表中数据是我乱编的 一 导入必要的库 import pandas as pd
  • 数据连接池默认配置带来的坑testOnBorrow=false,cloes_wait 终于解决了

    转载地址 http blog csdn net soberchina article details 72953996 首先说一下自己程序中遇到的问题 前一段新写了一个项目 主要为方便公司业务切库做准备 为其他项目提供接口 spring b
  • mybatis中的分页插件原理过程说明

    首先了解一下mybatis到底帮了我们做了哪些事 1 封装jdbc操作 2 利用反射将java对象与sql语句之间的互相转换 mybatis的架构设计 1 接口层 2 数据处理层 参数映射 通过parameterHandler sql解析通
  • 框架分析(11)-测试框架

    框架分析 11 测试框架 专栏介绍 Selenium 框架特性 多语言支持 多浏览器支持 元素定位 页面操作 等待机制 浏览器控制 测试报告 并行执行 集成测试框架 优缺点分析 优点 开源免费 跨平台 多语言支持 强大的定位器 支持多种测试
  • C++线程安全map (低效率)

    map的并发操作是不安全的 C 里边有红黑树实现的std map和hash表 unordered map 在 C 并发编程实战 一书中的162页提供了一个细粒度锁的MAP数据结构 使用了 boost的shared mutex C 14已经支
  • 快速制作一个chrome插件

    说在前面 在我日常开发以及娱乐生活中 浏览器是我使用频率较高的一个应用 当我大学拥有第一部电脑开始 之后不论电脑换成什么 以及使用的是什么系统 我的首选浏览器都是Chrome 不仅仅是因为其速度快 更多是它丰富的扩展在吸引我 那么大家有没有
  • Hive本地模式安装(详细)

    1 Hive简介 什么是Hive Hive是建立在Hadoop文件系统上的数据仓库 它提供了一系列工具 能够对存储在HDFS中的数据进行数据提取 转换和加载 ETL 这是一种可以存储 查询和分析存储在Hadoop中的大规模数据的工具 Hiv
  • C++Primer第五版习题答案(四)

    第四章 表达式 4 21 4 22 4 28 C Primer第五版课后习题答案目录 4 21 include
  • 电容器的四大特性是什么

    电容的作用 1 旁路 旁路电容是为本地器件提供能量的储能器件 它能使稳压器的输出均匀化 降低负载需求 就像小型可充电电池一样 旁路电容能够被充电 并向器件进行放电 为尽量减少阻抗 旁路电容要尽量靠近负载器件的供电电源管脚和地管脚 这能够很好
  • 解决jquery冲突问题的简单方法

    在使用jquery的框架的同时我们可能会使用其他的框架 其他的框架的里面也有可能包含 符号 此时就会发生jquery的冲突问题 解决方法有2个 1 释放 的使用权用jQuery noConflict 注意点 释放操作必须写在编写其他的jqu
  • 解决GitHub下载速度太慢的问题

    https blog csdn net qing666888 article details 79123742 直接在码云上下载 https gitee com 详细参考 https blog csdn net a1439775520 ar
  • Linxu下运行是.sh文件,显示权限不够

    问题 解决方案 chmod x DMAgentService sh
  • 服务器CPU占用过高和哪些因素有关呢

    服务器CPU占用过高和哪些因素有关呢 硬件因素 以下分别从CPU温度 CPU超线程 硬件配置 硬件驱动和待机方面分析 1 CPU温度过高 如果CPU风扇散热不好 会导致CPU温度太高 使CPU自动降频 从而使CPU的性能降低 总之高温时CP
  • EX Sports中文Telegram社区正式成立啦 欢迎中国地区的伙伴加入

    完成任务即可领取EXS 任务 1 关注twitter 3分 2 转发本条推文 2分 3 加入中文Telegram社区 5分 4 将表单分享并且成功邀请好友 5分 人 根据得分发放奖励 10分获得价值1USDT的EXS 20分获得价值2USD
  • OpenCV 训练分类器生成XML文件【完整过程】

    在网上找了好多相关信息 有几篇写的很好的 http blog csdn net tyt2222008 article details 5838389 http blog csdn net carson2005 article details
  • java设计模式——简单工厂模式(Simple Factory Pattern)

    定义 简单工厂模式 Simple Factory Pattern 又称为静态工厂方法 Static Factory Method 模式 它属于类创建型模式 在简单工 厂模 式中 可以根据参数的不同返回不同类的实例 结构 Factory 工厂