创建模式-工厂方法模式(Factory Method Pattern)

news2025/3/12 17:29:33

江城子·乙卯正月二十日夜记梦

  • 目的
  • 动机
  • 简单工厂
  • 示例代码

目的

定义一个创建对象的接口,该接口的子类具体负责创建具体的对象。工厂方法模式将对象的实例化延迟到子类。简单工厂是直接在创建方法中负责所有的产品的生成,造成该方法臃肿,并且当新增产品类时会修改该方法,违背了开闭原则 Open Close Principle 。

动机

创建模式其实都是对new关键字的封装和抽象,工厂方法也不例外,所以工厂方法首先解决的就是创建问题,即在一个类的创建过程比较复杂的情况下比如:一个对象的创建需要通过读取配置文件根据配置文件的参数来生成,或者类的创建过程又要依赖于其他类以及可能更复杂的情况。将对象复杂的创建过程封装到工厂的一个创建方法里,就可以方便其他调用者的使用。

简单工厂

简单工厂就是直接将对象的创建过程全部封装在一个方法里,需要生成不同的对象通过在生成的方法中传入不同的参数来对应不同的产品对象。这样简单工厂存在的问题就是,如果要新增产品类型,那么就需要修改简单工厂生成对象的逻辑,这里就违反了设计模式里面的开闭原则 Open Close Principle(对扩展开放,对修改关闭)。所以简单工厂适用于创建的类比较少的场景。

在这里插入图片描述

示例代码

  • 产品接口
package org.cqcs.knowledge.designpattern.creation.factorymethod.product;

/**
 * 抽象产品:按钮接口
 * }
 */
public interface IButton {
    void render();

    void onClick();
}
  • 产品实现
package org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl;

import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;


/**
 * 具体产品:Windows按钮
 */
public class WindowsButton implements IButton {
    @Override
    public void render() {
        System.out.println("Windows风格按钮渲染完成");
    }

    @Override
    public void onClick() {
        System.out.println("Windows按钮点击事件");
    }
}
package org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl;

import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;


/**
 * 具体产品:Mac按钮
 */
public class MacButton implements IButton {
    @Override
    public void render() {
        System.out.println("Mac风格按钮渲染完成");
    }

    @Override
    public void onClick() {
        System.out.println("Mac按钮点击事件");
    }
}

  • 工厂接口
package org.cqcs.knowledge.designpattern.creation.factorymethod.factory;

import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;

/**
 * 抽象创建者:按钮工厂接口
 */
public interface IButtonFactory {
    IButton createButton(); // 工厂方法
}
  • 工厂实现
package org.cqcs.knowledge.designpattern.creation.factorymethod.factory.impl;

import org.cqcs.knowledge.designpattern.creation.factorymethod.factory.IButtonFactory;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl.WindowsButton;


/**
 * 具体创建者:Windows按钮工厂
 */
public class WindowsButtonFactory implements IButtonFactory {
    @Override
    public IButton createButton() {
        return new WindowsButton();
    }
}

package org.cqcs.knowledge.designpattern.creation.factorymethod.factory.impl;

import org.cqcs.knowledge.designpattern.creation.factorymethod.factory.IButtonFactory;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl.MacButton;


/**
 * 具体创建者:Mac按钮工厂
 */
public class MacButtonFactory implements IButtonFactory {
    @Override
    public IButton createButton() {
        return new MacButton();
    }
}

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

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

相关文章

【eNSP实战】交换机配置端口隔离

交换机端口隔离可以实现在同一个VLAN内对端口进行逻辑隔离,端口隔离分为L2层隔离和L3层隔离,这里只进行L2层隔离演示。 拓扑图 路由器AR1配置GE 0/0/1配置IP,其余PC主机各自配置IP和网关。 现将PC1到PC4四个主机全部进行L2层隔离&#xff0c…

人脸识别之数据集中 PI20 和 CFMT 之间关联的模型预测贝叶斯(Python+论文代码实现)

代码文件(联系作者点击这里末尾) 代码文件描述如下: subjective_objective.ipynb和:这分别是实际的笔记本和 Web 浏览器友好的只读版本。此笔记本读取数据,执行一些预处理,并包含论文中使用的模型规范。它…

静态时序分析:无法满足的生成时钟(TIM-255警告、UITE-461或PTE-075错误)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在阅读本文前,强烈建议首先阅读介绍生成时钟的文章,尤其是其中关于时钟极性和反相的相关内容。 静态时序分析:SDC约束命令cr…

VSTO(C#)Excel开发2:Excel对象模型和基本操作

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

途游游戏25届AI算法岗内推

熟悉常用的编程语言,如Python、R等,具有良好的编码和调试能力;对常用的机器学习算法和深度学习框架(如TensorFlow、PyTorch等)有深入理解,对大型语言模型有一定了解,具备模型部署和微调的实践经…

【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目创新点 三、项目功能 四、开发技术介绍 五、项目功能展示 六、权威视频链接 一、项目背景 汽车行业数字化转型加速,销售数据多维分析需求激增。本项目针对传统报表系统交互性弱、实时性差等痛点,基于DjangoVue架构构建…

OpenCV应用:三种图像风格化案例

OpenCV 本身主要用于计算机视觉任务,例如图像处理、边缘检测、物体识别等,虽然它并不直接提供像 Photoshop 或其他艺术设计软件那样的 "风格化" 功能,但你可以通过一些图像处理技术在 OpenCV 中实现不同风格化效果。 1. 卡通化效果…

【Axure资料】110套优质可视化大屏模板+图表组件+科技感元件等

本作品集包含110套高保真可视化大屏模板,以及丰富的图表组件和科技感元件,旨在满足各行业对数据可视化展示的需求。所有模板和组件均基于Axure RP 9软件设计,确保高质量的交互体验和视觉效果。 作品类型:Axure原型模板 兼容版本&…

VanillaVueSvelteReactSolidAngularPreact前端框架/库的简要介绍及其优势

VanillaVueSvelteReactSolidAngularPreact前端框架/库的简要介绍及其优势。以下是这些前端框架/库的简要介绍及其优势: 1. Vanilla 定义:Vanilla 并不是一个框架,而是指 原生 JavaScript(即不使用任何框架或库)。优势…

Oracle 字符类型对比

本文以 Oracle12c 为例 1.主要区别对比 类型存储方式最大长度字符集支持适用场景备注​CHAR(M)固定长度空格填充2000 字节,M 代表字节长度默认字符集固定长度编码实际存储长度固定为定义长度(如 CHAR(10) 始终占 10 字节)​VARCHAR2(M)可变长…

阿里云操作系统控制台实战评测:提升云资源管理与监控效率

文章目录 前言产品介绍操作系统控制台体验阿里云操作系统开通 帮助与总结建议 前言 随着云计算和虚拟化技术的发展,操作系统控制台作为运维管理的核心工具之一,在现代IT环境中发挥着越来越重要的作用。它提供了一种更加直观、高效的方式来管理操作系统&…

Linux本地部署deepseek及SpringBoot集成deepseek

一、ollama安装 本文以linux安装为例(服务器主机ip:192.168.109.210) 1、自动安装(方式一) curl -fsSL https://ollama.com/install.sh | sh 2、手动安装(方式二) (1)下载二进制文件 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…

用物理信息神经网络(PINN)解决实际优化问题:全面解析与实践

摘要 本文系统介绍了物理信息神经网络(PINN)在解决实际优化问题中的创新应用。通过将物理定律与神经网络深度融合,PINN在摆的倒立控制、最短时间路径规划及航天器借力飞行轨道设计等复杂任务中展现出显著优势。实验表明,PINN相比…

RabbitMQ之旅(1)

相信自己,终会成功 目录 主流MQ产品 1.kafaka 2.RocketMQ 3.RabbitMQ 在xshell上安装RabbitMQ RabbitMQ七种工作模式 1.简单模式 ​编辑 2.工作队列模式 3.发布/订阅模式 4.路由模式 5.通配符模式 6.RPC模式 AMQP.BasicProperties 设置消息属性的类 7.发布确认模…

HTML-网页介绍

一、网页 1.什么是网页: 网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”,通常是 HTML 格式的文件,它要通过浏览器来阅读。 网页是构成网站的基本元素&#xf…

【C#学习笔记03】进制转换与反码、补码、原码

1. 进制转换 计算机中的数据通常以二进制形式存储,但在编程和调试过程中,我们经常需要与十进制、八进制和十六进制打交道。因此,掌握进制转换是C语言学习中的重要一环。 1.1 进制的基本概念 二进制(Binary)&#xff…

python学智能算法(七)|KNN邻近算法

【1】引言 前述学习进程中,已经了解了一些非常经典的智能算法,相关文章包括且不限于: python学智能算法(三)|模拟退火算法:深层分析_模拟退火 动画演示-CSDN博客 python学智能算法(四&#x…

Java数据结构第二十二期:Map与Set的高效应用之道(一)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、Map和Set 1.1. 概念 二、搜索树 2.1. 概念 2.2. 查找操作 2.2. 插入操作 2.3. 删除操作 2.4. 性能分析 三、搜索 3.1. 概念及场景 3.2. 模型 四、Map 4.1. Map的说明 3.2. Map的使用 五…

兴达易控modbusTCP转profinet接防撞雷达测试

modbusTCP转profinet接防撞雷达测试 随着工业自动化程度的不断提高,现场设备之间的通信需求日益增长。ModbusTCP作为一种广泛应用的工业通信协议,因其简单、可靠的特点,被广泛应用于各种自动化设备中。而Profinet作为工业以太网的一种&#…

flutter实践:断点调试踩坑

问题:使用VSCode开发flutter,最近突然开始打断点不生效,程序可以attach,修改有日志输出,但是断点处怎么都停不了,程序异常断点会停。 分析:开始误以为是flutterSDK出了问题折腾了一天,后来又怀疑是lauch.j…