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

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(使用前将#替换为@)

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

  • 使用 objectGUID 进行查询 - Spring LDAP 模板

    我正在尝试获取 存储并依次使用 objectGUID 来查询 Active Directory 为了获取用户属性我正在使用以下 public static class MyDnKeyValueAttMapper implements Att
  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • 在 MongoDB Java 驱动程序中如何使用 $filter

    我有一个适用于 MQL 的查询 我需要将其翻译成Java MQL 中的查询如下所示 db
  • Java,将 null 分配给对象和仅声明之间有什么区别

    之间有什么区别 Object o null and Object o 仅声明 有人可以回答我吗 这取决于您声明变量的范围 例如 局部变量没有default values在这种情况下你将不得不分配null手动 在这种情况下实例变量分配 nul
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 隐藏类的 System.out.print 调用

    我正在使用 java 库 jar 文件 该文件的作者放入了一堆System out print and System out printlns 有没有办法隐藏特定对象的这些消息 编辑 看起来jar文件似乎正在创建一堆线程 并且每个线程都有它
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • ASM之前看一下maxStack指令吗?

    我正在尝试使用 ASM 库将字节代码转换为不同的格式 这可以使用 MethodVisitor 来完成 就像这个简单的测试代码一样 return new MethodVisitor ASM7 Override public void visi
  • Java 反射:如何检索匿名内部类?

    我在另一个类中有一个匿名内部类 SomeClass Both SomeClass class getClasses and SomeClass class getDeclaredClasses 返回空数组 我在中找不到一些关于此的提示Cla
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • Java中的OR运算(BitSet.class)

    如何编写一个程序 该程序需要001010101110000100100 011100010001000011000 000000000010000000000100 作为输入 位 输出将是OR其中 3 个 OR 0 0 0 0 1 1 1
  • 如何告诉 cxf 将包装类型保留在方法中?

    在我的 WSDL 中我有一个操作
  • 我可以关闭并重新打开套接字吗?

    我学习了一个使用套接字的例子 在此示例中 客户端向服务器发送请求以打开套接字 然后服务器 侦听特定端口 打开套接字 一切都很好 套接字从双方 客户端和服务器 打开 但我仍然不清楚这个东西有多灵活 例如 客户端是否可以关闭一个打开的 从两端
  • 如何告诉 IntelliJ 使用 Java 1.6 JDK 启动 gradle?

    一个简单的问题 即使经过几个小时的尝试和搜索 我也无法弄清楚 我安装了 Java 6 和 7 如何告诉 IntelliJ 使用 JDK 版本 1 6 启动 Gradle 构建 无论我做什么 IntelliJ 都会以以下方式开始我的 grad
  • Checkstyle - 方法按修饰符排序

    是否可以添加到 checkstyle 规则以按修饰符对类中的方法进行排序 我的意思是开头的公共方法和最后的私有方法 MethodsOrderCheck做这个工作 检查文档 https www qulice com qulice checks
  • 如何配置嵌入式 MongoDB 以在 Spring Boot 应用程序中进行集成测试?

    我有一个相当简单的 Spring Boot 应用程序 它公开一个小型 REST API 并从 MongoDB 实例检索数据 对 MongoDB 实例的查询通过基于 Spring Data 的存储库 下面的一些关键代码 Main applic
  • 线程“main”中出现异常 java.lang.UnsatisfiedLinkError: ... \jzmq.dll: 找不到依赖库

    我有一个使用 ZMQ 的 java 应用程序 我已经能够在我的 Win7 PC 上运行它 我将 jzmq dll 放在 jar 可执行文件所在的同一文件夹中 然后通过命令 java jar myapp jar 运行它 我的下一步是将其移至服
  • 使用 Hibernate 防止无限循环数据检索

    我想知道 想象一个场景 例如 POJO public class User private String userName private String name private String surname private List
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

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

    本文章原创首发于公众号 编程三分钟 我关注了很多技术类的公众号 看着大佬的公众号几千的阅读量 甚是羡慕 这直接导致了我没有心情减肥 甚至多吃了一个鸡腿 要怎么才能写出一篇好技术文章 让读到的人感到身心舒畅 快速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 使得一个类的实例化延迟到子