设计模式精讲-工厂方法模式

2023-11-01

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类。
在这里插入图片描述

实战说明

定义一个Product接口

//稳定的生产接口
interface Product{
    public void method();
}

不同产品A,B各自实现该接口

//产品A
class ProductA implements Product{
    @Override
    public void method() {
        System.out.println("ProductA  method executed");
    }
}

//产品B
class ProductB implements Product{
    @Override
    public void method() {
        System.out.println("ProductB  method executed");
    }
}

简单工厂实现(不是设计模式)

在这里插入图片描述

//简单工厂
class SimpleFactory{
    public static Product createProduct(String type){
        if (type.equals("0")){
            return new ProductA();
        }else if(type.equals("1")){
            return new ProductB();
        }
        else {
            return null;
        }
    }
}

创用者,通过简单工厂创建对应产品,再执行产品对应的方法

  public static void main(String[] args) {
      Product product = SimpleFactory.createProduct("0");
      product.method();
  }

工厂方法

分析哪些是稳定不会变:要调用A,B中的方法,需要先把产品对象创建出来。
实施:抽象出来的创建产品方法createProduct,定义抽象类Application,getObject获取产品

abstract class Application{
    abstract Product createProduct();
	
    Product getObject(){
        Product product = createProduct();
        //.....
        //....
        //其他一系列业务处理,如数据填充
        return product;
    }
}

定义具体产品生产者ConcreteProductA,ConcreteProductB继承抽象类Application,实现抽象方法createProduct

class ConcreteProductA extends Application{
    @Override
    Product createProduct() {
        return new ProductA();
    }
}

class ConcreteProductB extends Application{
    @Override
    Product createProduct() {
        return new ProductB();
    }
}

调用

public class FactoryMethodTest {
  public static void main(String[] args) {
      Application application = new ConcreteProductB();
      Product product = application.getObject();
      product.method();
  }
}

应用场景

1.当你不知道该使用对象的确切类型的时候
2.当你希望为库或框架提供扩展其内部组件的方法时

主要优点

1.将具体产品和创建者解耦
2.符合单一职责原则
3.符合开闭原则

源码中的应用

大家可以自行的查看,这里不做讲解

// java api 
// 静态工厂方法 
 Calendar.getInstance() 
 java.text.NumberFormat.getInstance() 
 java.util.ResourceBundle.getBundle() 
 // 工厂方法 
 java.net.URLStreamHandlerFactory 
 javax.xml.bind.JAXBContext.createMarshaller
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式精讲-工厂方法模式 的相关文章

  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • 写技术文的三个原则是什么?

    本文章原创首发于公众号 编程三分钟 我关注了很多技术类的公众号 看着大佬的公众号几千的阅读量 甚是羡慕 这直接导致了我没有心情减肥 甚至多吃了一个鸡腿 要怎么才能写出一篇好技术文章 让读到的人感到身心舒畅 快速Get到想说的点 我想破了脑袋
  • Jetpack架构组件库:DataStore

    Jetpack DataStore 是一种经过改进的新数据存储解决方案 旨在取代 SharedPreferences DataStore 基于 Kotlin 协程和 Flow 构建而成 提供以下两种不同的实现 Preferences Dat
  • 【解决方法】chrome和edge浏览器出现“你的连接不是专用连接“的问题

    原创作者 运维工程师 林琪 1 问题描述 chrome和edge浏览器访问一些证书不受信任的网页会出现 你的连接不是专用连接 的问题 无法继续访问网页 2 解决方法 在上图这个问题界面的时候 输入法在英文状态下 输入 thisisunsaf
  • ByteBuffer之HeapByteBuffer与DirectByteBuffer

    HeapByteBuffer HeapByteBuffer 是写在jvm堆上面的一个buffer 底层的本质是一个数组 用类封装维护了很多的索引 limit position capacity等 在实际操作时 会把jvm堆上数据拷贝出来到系
  • WSL2+Ubuntu18.04+gnome图形界面+docker搭建开发环境

    最近换了电脑 系统更新到2004 捣腾了一下WSL2 尝试把开发环境搭建在WSL2里面 看了很多教程 基本都是Xfce的 但是更喜欢Gnome 所以就用Ubuntu主流的Gnome作为桌面GUI WSL2的安装 WSL 2的安装因为微软提供
  • VS2015和QT代码快捷键

    VS2015 代码自动对齐快捷键 1 Ctrl A 2 Ctrl K 3 Ctrl F QT 代码自动对齐快捷键 1 Ctrl A 2 Ctrl I
  • 专利交底书

    qq
  • Java在Quant应用_BigQuant人工智能量化平台使用

    BigQuant人工智能量化平台使用 BigQuant人工智能量化平台使用 Author By Runsen 在2020年一月初 也是我大三上的寒假 我开始写书 为什么呢 因为化工原理和化工热力学挂了 我需要重拾自己的自信 对于一个大学三年
  • 今天和朋友们分享如何巧用MACD指标进行恒指多空方向判断

    说起MACD指标 我们无论是做股票还是期货的朋友其实都有了解 之前也有相关文章专做分析过此指标的一些妙用 今天受一些朋友建议 均已将带领大家重温 MACD 指标课堂 今日课题主要同大家讲解一下 MACD柱线与0轴位置切换 以及MACD变化过
  • 渗透测试技术题(面试、笔试)

    本篇文章主要涉及一下几个方面 java view plain copy 对称加密非对称加密 什么是同源策略 cookie存在哪里 可以打开吗 xss如何盗取cookie tcp udp的区别及tcp三次握手 syn攻击 证书要考哪些 DVW
  • python13个小题

    python小题 1 从键盘输入3个数 求最大值 2 买彩票 如果体彩中了500万 我买车 资助希望工程 去欧洲旅游 否则我买下一期体彩 继续烧高香 写程序描述 3 会员购物时 根据积分的不同享受不同的折扣 计算会员购物时获得的折扣 小于2
  • Linux PXE详解

    今天我们继续给大家介绍Linux相关内容 本文主要内容是PXE系统的部署 并且通过实战 完成PXE环境的实战部署 由于PXE环境牵扯到的服务众多 因此 您需要了解FTP DHCP等服务的原理 安装 部署等知识 如果您对此还存在困惑 欢迎查阅
  • Jtti:Linux大文件重定向和管道的效率哪个更高

    在Linux中 重定向和管道是不同的工具 用于不同的任务 它们的效率也取决于具体的使用情况 让我们比较一下它们的特点和效率 重定向 特点 重定向是将命令的输出写入文件或设备的过程 它通常用于将命令的输出保存到文件中或将输入从文件中读取 重定
  • 交易系统模块划分,模块拆分,设计,重构实战.状态

    父文章 技术设计金字塔 包含了实体设计文章 相关文章 如何梳理和重构 含复杂性度量 相关文章 代码级 如何写可维护的代码 万物ddd ddd primitive 封装 对象来实现可维护代码 个人渣记录仅为自己搜索用的博客 CSDN博客 dd
  • docker如何搭建Kafka

    1 介绍 Kafka是一个分布式流处理平台 用于高吞吐量 低延迟的数据传输和处理 一般是用做分布式系统的消息中间件 2 前提概要 阅读本章博客之前 你至少需要满足以下条件 电脑已经安装过docker 已经使用docker搭建了zookeep
  • 【Java SE】return的用法(快速扫盲)

    点进来你就是我的人了博主主页 戳一戳 欢迎大佬指点 欢迎志同道合的朋友一起加油喔 目录 前言 1 定义 2 return的用法 3 break和return的区别 前言 此篇帮助不理解return用法的小伙伴们快速扫盲 1 定义 retur
  • 分布式光伏消纳的微电网群共享储能配置策略研究——Matlab代码复现

    目录 摘要 研究背景 共享储能参与微能源网新能源消纳模式 共享储能电站容量功率配置原则 Matlab算例运行结果 编辑 Matalb代码 数据分享 摘要 共享储能是可再生能源实现经济消纳的解决方案之一 在适度的投资规模下 应尽力实现储能电站
  • mocha如何实现异步测试

    异步测试 用mocha测试一个函数是非常简单的 但是 在JavaScript的世界中 更多的时候 我们编写的是异步代码 所以 我们需要用mocha测试异步函数 我们把上一节的hello test工程复制一份 重命名为async test 然
  • 如何面对基金下跌时的失落感?

    你知道追高 almost All in式入市 转眼被市场放倒在地上摩擦 资产被套牢 最深处超20 时间跨度达2 3年之久 是种什么样的体验吗 我知道 大家好 我是睿齐 一个奋斗在实现财富自由一线的打工者 3 4年之前 作为一只涉 市 未深的
  • 设计模式精讲-工厂方法模式

    设计模式精讲 工厂方法模式 模式定义 实战说明 简单工厂实现 不是设计模式 工厂方法 应用场景 主要优点 源码中的应用 模式定义 定义一个用于创建对象的接口 让子类决定实例化哪一个类 Factory Method 使得一个类的实例化延迟到子