新网站在谷歌上面怎么做推广/全国十大跨境电商公司排名

新网站在谷歌上面怎么做推广,全国十大跨境电商公司排名,软件开发培训学校排行,做h5小游戏的网站有哪些👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD
🔥 2025本人正在沉淀中… 博客更新速度++
👍 欢迎点赞、收藏、关注,跟上我的更新节奏
🎵 当你的天空突然下了大雨,那是我在为你炸乌云

文章目录

  • 一、入门
    • 什么是工厂方法模式?
    • 为什么要工厂方法模式?
    • 如何实现工厂方法模式
  • 二、工厂方法模式在框架源码中的运用
    • Java 集合框架中的工厂方法模式
    • Spring 框架中的工厂方法模式
  • 三、总结
    • 工厂方法模式的优点
    • 工厂方法模式的缺点
    • 工厂方法模式的适用场景

一、入门

什么是工厂方法模式?

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟到子类。
简单工厂方法就是所有的产品都交给一个工厂来处理,而工厂方法是交给多个工厂。

为什么要工厂方法模式?

假设我们正在开发一个支付系统,支持多种支付方式(如支付宝、微信支付、银行卡支付等)。在没有工厂方法模式的情况下,代码可能是这样的:

// 支付接口
interface Payment {void pay(double amount);
}// 支付宝支付
class Alipay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付: " + amount + " 元");}
}// 微信支付
class WechatPay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用微信支付: " + amount + " 元");}
}// 银行卡支付
class BankCardPay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用银行卡支付: " + amount + " 元");}
}// 客户端代码
public class PaymentSystem {public static void main(String[] args) {String paymentType = "alipay"; // 假设从配置或用户输入中获取支付方式Payment payment = null;if (paymentType.equals("alipay")) {payment = new Alipay();} else if (paymentType.equals("wechatpay")) {payment = new WechatPay();} else if (paymentType.equals("bankcard")) {payment = new BankCardPay();} else {throw new IllegalArgumentException("不支持的支付方式");}payment.pay(100.0); // 执行支付}
}

问题分析

  1. 代码耦合性高
    • 客户端代码(PaymentSystem)直接依赖具体的支付实现类(如 Alipay、WechatPay 等)。
    • 如果需要新增一种支付方式(如 ApplePay),必须修改客户端代码,增加新的 if-else 分支。
  2. 违反开闭原则
    • 开闭原则(Open/Closed Principle)要求软件实体应对扩展开放,对修改关闭。
    • 在当前实现中,每次新增支付方式都需要修改客户端代码,而不是通过扩展来实现。
  3. 代码重复
    • 如果在多个地方需要创建支付对象,相同的 if-else 逻辑会重复出现,导致代码冗余。
  4. 难以测试
    • 客户端代码与具体支付实现类耦合,难以进行单元测试(例如,无法轻松模拟支付对象)。

如何实现工厂方法模式

主要角色

  1. 抽象产品(Product):定义产品的接口。
  2. 具体产品(Concrete Product):实现抽象产品接口的具体类。
  3. 抽象工厂(Creator):声明工厂方法,返回一个产品对象。
  4. 具体工厂(Concrete Creator):实现工厂方法,返回具体产品的实例。

【案例】支付方式 - 改
在这里插入图片描述
抽象产品(Product):支付方式,Payment类。

// 支付接口
interface Payment {void pay(double amount);
}

具体产品(Concrete Product): 支付宝支付(Alipay类)、微信支付(WechatPay类)、银行卡支付(BankCardPay类)。

// 支付宝支付
class Alipay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付: " + amount + " 元");}
}// 微信支付
class WechatPay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用微信支付: " + amount + " 元");}
}// 银行卡支付
class BankCardPay implements Payment {@Overridepublic void pay(double amount) {System.out.println("使用银行卡支付: " + amount + " 元");}
}

抽象工厂(Creator): 支付工厂,PaymentFactory类。

interface PaymentFactory {Payment createPayment();
}

具体工厂(Concrete Creator)AlipayFactoryWechatPayFactoryBankCardPayFactory

// 支付宝支付工厂
class AlipayFactory implements PaymentFactory {@Overridepublic Payment createPayment() {return new Alipay();}
}// 微信支付工厂
class WechatPayFactory implements PaymentFactory {@Overridepublic Payment createPayment() {return new WechatPay();}
}// 银行卡支付工厂
class BankCardPayFactory implements PaymentFactory {@Overridepublic Payment createPayment() {return new BankCardPay();}
}

客户端调用

public class PaymentSystem {// 支付方式与工厂类的映射private static final Map<String, PaymentFactory> paymentFactories = new HashMap<>();static {// 初始化映射关系paymentFactories.put("alipay", new AlipayFactory());paymentFactories.put("wechatpay", new WechatPayFactory());paymentFactories.put("bankcard", new BankCardPayFactory());}// 获取支付对象public static Payment getPayment(String paymentType) {PaymentFactory factory = paymentFactories.get(paymentType);if (factory == null) {throw new IllegalArgumentException("不支持的支付方式: " + paymentType);}return factory.createPayment();}public static void main(String[] args) {String paymentType = "alipay"; // 假设从配置或用户输入中获取支付方式// 获取支付对象并执行支付Payment payment = getPayment(paymentType);payment.pay(100.0);}
}

二、工厂方法模式在框架源码中的运用

Java 集合框架中的工厂方法模式

Java 集合框架中的 Collections 工具类提供了多个静态工厂方法,用于创建不可变集合、同步集合等。
示例:Collections.unmodifiableList()
Collections.unmodifiableList() 是一个工厂方法,用于创建不可修改的列表。

public class Collections {public static <T> List<T> unmodifiableList(List<? extends T> list) {return new UnmodifiableList<>(list);}private static class UnmodifiableList<E> extends UnmodifiableCollection<E>implements List<E> {// 具体实现...}
}
  • 工厂方法:unmodifiableList() 是工厂方法,负责创建 UnmodifiableList 对象。
  • 客户端:客户端通过调用 unmodifiableList() 方法获取不可修改的列表,而无需关心具体的实现类。
List<String> originalList = new ArrayList<>();
originalList.add("A");
originalList.add("B");List<String> unmodifiableList = Collections.unmodifiableList(originalList);
// unmodifiableList.add("C"); // 抛出 UnsupportedOperationException
  • 解耦:客户端不需要知道 UnmodifiableList 的具体实现,只需要通过工厂方法获取对象。
  • 安全性:工厂方法返回的对象是不可修改的,保证了数据的安全性。

Spring 框架中的工厂方法模式

Spring 框架广泛使用工厂方法模式来创建和管理 Bean 对象。Spring 的 BeanFactoryApplicationContext 是典型的工厂方法模式的实现。
示例:BeanFactory
BeanFactory 是 Spring 的核心接口,负责创建和管理 Bean 对象。它定义了工厂方法 getBean(),用于获取 Bean 实例。

public interface BeanFactory {Object getBean(String name) throws BeansException;<T> T getBean(String name, Class<T> requiredType) throws BeansException;// 其他方法...
}
  • 工厂方法getBean() 是工厂方法,负责根据名称或类型创建并返回 Bean 对象。
  • 具体工厂:Spring 提供了多个 BeanFactory 的实现类,例如 DefaultListableBeanFactory
  • 客户端:Spring 容器(如 ApplicationContext)通过调用 getBean() 方法来获取 Bean 对象。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService myService = context.getBean("myService", MyService.class);
myService.doSomething();
  • 解耦:客户端代码(如 MyService)不需要知道具体的 Bean 创建逻辑,只需要通过 getBean() 方法获取对象。
  • 灵活性:Spring 可以通过配置文件或注解动态决定创建哪个 Bean 对象。

三、总结

工厂方法模式的优点

  1. 解耦
    • 工厂方法模式将对象的创建与使用分离,客户端代码只需要依赖抽象的工厂接口和产品接口,而不需要关心具体的实现类。
    • 例如,在 Spring 框架中,客户端通过 BeanFactory 获取 Bean 对象,而不需要知道具体的 Bean 实现类。
  2. 符合开闭原则
    • 当需要新增一种产品时,只需新增一个具体工厂类和具体产品类,而无需修改现有代码。
    • 例如,在支付系统中,新增一种支付方式(如 ApplePay)时,只需新增 ApplePayFactoryApplePay 类,而不需要修改客户端代码。
  3. 可扩展性
    • 工厂方法模式支持动态扩展,可以通过配置文件、依赖注入等方式动态决定使用哪个具体工厂类。
    • 例如,在 JDBC 中,可以通过配置文件动态切换数据库驱动。
  4. 代码复用
    • 工厂类的逻辑可以复用在多个地方,避免了重复的创建逻辑。
    • 例如,在 Log4j 中,Logger.getLogger() 方法可以在多个地方复用,而不需要重复编写日志记录器的创建逻辑。
  5. 易于测试
    • 客户端代码依赖于抽象的工厂接口和产品接口,可以通过模拟工厂类来测试客户端代码,而不需要依赖具体的实现类。

工厂方法模式的缺点

  1. 类的数量增加
    • 每新增一种产品,就需要新增一个具体工厂类和具体产品类,导致类的数量增加,系统复杂度提高。
    • 例如,在支付系统中,如果有 10 种支付方式,就需要 10 个具体工厂类和 10 个具体产品类。
  2. 增加了系统抽象性
    • 工厂方法模式引入了抽象的工厂接口和产品接口,增加了系统的抽象性,可能会使代码更难理解。
    • 例如,对于初学者来说,理解 Spring 的 BeanFactoryApplicationContext 可能需要一定的学习成本。
  3. 不适合简单场景
    • 如果对象的创建逻辑非常简单,使用工厂方法模式可能会显得过于复杂,增加不必要的代码量。
    • 例如,如果只需要创建一个简单的对象,直接使用 new 关键字可能更合适。

工厂方法模式的适用场景

  1. 需要动态创建对象
    • 当对象的创建逻辑需要根据运行时条件动态决定时,工厂方法模式非常适用。
    • 例如,在支付系统中,根据用户选择的支付方式动态创建支付对象。
  2. 需要解耦对象的创建与使用
    • 当客户端代码不需要关心具体对象的创建逻辑时,可以使用工厂方法模式将对象的创建过程封装起来。
    • 例如,在 Spring 框架中,客户端通过 BeanFactory 获取 Bean 对象,而不需要知道具体的 Bean 实现类。
  3. 需要支持多种产品类型
    • 当系统需要支持多种产品类型,并且这些产品有共同的接口时,可以使用工厂方法模式。
    • 例如,在日志框架中,支持多种日志实现(如文件日志、控制台日志等)。
  4. 需要符合开闭原则
    • 当系统需要频繁扩展新的产品类型,并且希望在不修改现有代码的情况下实现扩展时,可以使用工厂方法模式。
    • 例如,在 GUI 库中,支持新增一种控件类型(如按钮、文本框等)。
  5. 需要集中管理对象的创建逻辑
    • 当对象的创建逻辑比较复杂,或者需要在多个地方复用时,可以使用工厂方法模式将创建逻辑集中管理。
    • 例如,在 JDBC 中,通过 DriverManager.getConnection() 集中管理数据库连接的创建逻辑。

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

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

相关文章

基于STM32的智能工业设备健康监测系统

1. 引言 工业设备故障导致的生产停滞问题日益突出&#xff0c;传统人工巡检方式效率低且难以捕捉早期隐患。本文设计了一款基于STM32的智能工业设备健康监测系统&#xff0c;通过振动分析、温度监测与声纹识别技术&#xff0c;实现设备状态实时评估、故障预警与维护决策支持&a…

旧手机热点无法提供ipv6解决方法(emui 8 热点提供ipv6)

旧手机热点无法提供ipv6解决方法 手机&#xff1a;荣耀8x 系统版本: EMUI 8 网络&#xff1a;移动流量卡 解决方案 设置-》无线和网络-》移动网络-》接入点名称(APN)-》cmiot 修改 APN协议: IPv4/IPv6 修改 APN漫游协议: IPv4/IPv6

Memcached和redis对比了解

1.介绍 Memcached 是一个高性能、分布式的内存缓存系统&#xff0c;用于加速动态 Web 应用程序&#xff0c;减少数据库负载。它的核心功能是将数据存储在内存中&#xff0c;并通过基于键值对&#xff08;Key-Value&#xff09;的方式快速读取数据。 Redis 和 Memcached 选择建…

SOME/IP--协议英文原文讲解9

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.1.4 T…

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车&#xff0c;搭载5.0 L发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;接通空调开关后&#xff0c;有时出风忽大忽小&#xff0c;有时不出风&#xff0c;有时要等2 min左右才出风&#xff1b;有时两三天出现一次&#xff0c;…

【SQL】SQL多表查询

多表查询案例联系点击此处 &#x1f384;概念 一般我们说的多表查询都涉及外键和父子表之间的关系。比如一对多:一般前面指的是父表后面指的是子表。 ⭐分类 一对多(多对一) 多对多 一对一 ⭐一对多 &#x1f4e2;案例&#xff1a;部门与员工的关系 &#x1f4e2;关系&…

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言&#xff08;官网是&#xff1a;https://open.bigmodel.cn&#xff09;的案例&#xff0c;回答响应流式输出显示&#xff0c;这里使用的是免费模型&#xff0c;需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…

GPT-SoVITS更新V3 win整合包

GPT-SoVITS 是由社区开发者联合打造的开源语音生成框架&#xff0c;其创新性地融合了GPT语言模型与SoVITS&#xff08;Singing Voice Inference and Timbre Synthesis&#xff09;语音合成技术&#xff0c;实现了仅需5秒语音样本即可生成高保真目标音色的突破。该项目凭借其开箱…

集合 数据结构 泛型

文章目录 1.Collection集合1.1数组和集合的区别【理解】1.2集合类体系结构【理解】1.3Collection 集合概述和使用【应用】内部类匿名内部类Lambda表达式 1.4Collection集合的遍历【应用】1.5增强for循环【应用】 2.List集合2.1List集合的概述和特点【记忆】2.2List集合的特有方…

[uniapp] 实现扫码功能,含APP、h5、小程序

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

【从0做项目】Java搜索引擎(3)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 文章导读 阿华将发布项目复盘系列的文章&#xff0c;旨在&#xff1a; 1&#xff1a;手把手细致带大家从0到…

解惑Python:一文解决osgeo库安装失败问题

Osgeo&#xff08;Open Source Geospatial Foundation&#xff09;是一个支持开源地理空间数据处理的基金会&#xff0c;我们可以在python中使用“osgeo”库来访问其提供的高效地理空间数据。例如&#xff0c;我们使用该模块提供的GDAL处理栅格数据&#xff0c;使用OGR处理矢量…

React入门 - 0.React简介

React入门 - React简介 A Brief Introduction to React By JacksonML 1. 关于React React是一个知名的Web框架。众所周知&#xff0c;jQuery, Angular, Vue等框架都曾闪亮登场&#xff0c;并且&#xff0c;都仍然在全球市场占有一席之地。React这个颇有担当的新锐&#xff0…

如何在Windows下使用Ollama本地部署DeepSeek R1

参考链接&#xff1a; 通过Ollama本地部署DeepSeek R1以及简单使用的教程&#xff08;超详细&#xff09; 【DeepSeek应用】DeepSeek R1 本地部署&#xff08;OllamaDockerOpenWebUI&#xff09; 如何将 Chatbox 连接到远程 Ollama 服务&#xff1a;逐步指南 首先需要安装oll…

网络原理-

文章目录 协议应用层传输层网络层 数据链路层 协议 在网络通信中,协议是非常重要的概念.协议就是一种约定. 在网络通信过程中,对协议进行了分层 接下来就按照顺序向大家介绍每一种核心的协议. 应用层 应用层是咱们程序员打交道最多的一层协议.应用层里有很多现成的协议,但…

从零搭建微服务项目Base(第7章——微服务网关模块基础实现)

前言&#xff1a; 在前面6章的学习中已经完成了服务间的调用实现&#xff0c;即各微服务通过nacos或eureka服务器完成服务的注册&#xff0c;并从nacos中拉取配置实现热更新。当某个服务接口需要调用其他服务时&#xff0c;通过feign定义接口&#xff0c;并通过注解配置服务名…

在Vue项目中使用three.js在前端页面展示PLY文件或STL文件

前言&#xff1a;这是一个3d打印局域网管理系统的需求 一、安装three.js three.js官网&#xff1a;https://threejs.org/docs/#manual/en/introduction/Installation 我用的是yarn,官网用的是npm 二、使用three.js 1.在script部分导入three.js import * as THREE from thr…

DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

通过监督微调提升多语言大语言模型性能

引言 澳鹏助力一家全球科技公司提升其大语言模型&#xff08;LLM&#xff09;的性能。通过提供结构化的人工反馈形式的大语言模型训练数据&#xff0c;让该模型在30多种语言、70多种方言中的表现得到优化。众包人员们进行多轮对话&#xff0c;并依据回复的相关性、连贯性、准确…