设计模式简述(三)工厂模式

工厂模式

  • 描述
    • 简单工厂(静态工厂)
      • 工厂方法模式
    • 抽象工厂
    • 增加工厂管理类
    • 使用

描述

工厂模式用以封装复杂的实例初始化过程,供外部统一调用

简单工厂(静态工厂)

如果对象创建逻辑简单且一致,可以使用简单工厂。传入想要生成的实例类型

public class HumanFactory {public static <T> T getInstance(Class<T> c) {try {return (T) Class.forName(c.getName()).getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException("生成对象异常", e);}}
}

工厂方法模式

多种类型产品初始化逻辑不一致时,可以采用不同工厂实例来初始化对应类型的产品
由于每种产品定义了对应的工厂类,因此工厂方法不需要类型参数就非常明确需要创建的实例

  • 声明工厂抽象定义
public abstract class AbstractProductFactory {public abstract Product createProduct();
}
  • 声明产品抽象定义
public interface Product {String getName();default void description() {System.out.println("产品名称:" + getName());}
}
  • 定义具体产品
public class Apple implements Product {@Overridepublic String getName() {return "苹果";}
}public class Banana implements Product {@Overridepublic String getName() {return "香蕉";}
}
  • 定义产品对应的工厂
public class AppleFactory extends AbstractProductFactory {public Product createProduct() {// 苹果其他初始化逻辑return new Apple();}
}public class BananaFactory extends AbstractProductFactory {public Product createProduct() {// 香蕉其他初始化逻辑return new Banana();}
}
  • 使用
public static void main(String[] args) {AbstractProductFactory appleFactory = new AppleFactory();Product product = appleFactory.createProduct();product.description();AbstractProductFactory bananaFactory = new BananaFactory();Product banana = bananaFactory.createProduct();banana.description();
}

抽象工厂

以上工厂方法,一个产品就需要一个工厂类。
如果产品本身就有一些共通的地方,我们可以将产品划分到同一个工厂的不同产品线,这些产品的生产可以共用一些资源。

比如,我的产品都分为大、中、小三种分类。分别进行不同的加工

  • 声明抽象水果
public interface Fruit {String getName();String getSize();default void description() {System.out.println("产品名称:" + getSize() + getName());}
}
  • 声明具体水果
public class BigApple implements Fruit {@Overridepublic String getName() {return "苹果";}@Overridepublic String getSize() {return "大号";}
}public class MiddleApple implements Fruit {@Overridepublic String getName() {return "苹果";}@Overridepublic String getSize() {return "中号";}
}public class SmallApple implements Fruit {@Overridepublic String getName() {return "苹果";}@Overridepublic String getSize() {return "小号";}
}
public class BigBanana implements Fruit {@Overridepublic String getName() {return "香蕉";}@Overridepublic String getSize() {return "大号";}
}public class MiddleBanana implements Fruit {@Overridepublic String getName() {return "香蕉";}@Overridepublic String getSize() {return "中号";}
}public class SmallBanana implements Fruit {@Overridepublic String getName() {return "香蕉";}@Overridepublic String getSize() {return "小号";}
}
  • 声明抽象工厂
public abstract class AbstractFruitFactory {abstract Fruit bigFruit();abstract Fruit middleFruit();abstract Fruit smallFruit();
}
  • 定义具体工厂
public class AppleFruitFactory extends AbstractFruitFactory{@OverrideFruit bigFruit() {return new BigApple();}@OverrideFruit middleFruit() {return new MiddleApple();}@OverrideFruit smallFruit() {return new SmallApple();}
}
public class BananaFruitFactory extends AbstractFruitFactory {@OverrideFruit bigFruit() {return new BigBanana();}@OverrideFruit middleFruit() {return new MiddleBanana();}@OverrideFruit smallFruit() {return new SmallBanana();}
}

增加工厂管理类

当抽象工厂的子类扩展时,调用方需要和各个子类工厂交互,在一定程度上违反了迪米特法则。
我们可以将工厂子类交由工厂管理类进行管理,调用方只需要和这个管理类交互即可

public final class FruitFactoryManager {private static Map<String, AbstractFruitFactory> register = new HashMap<>();static {register.put("apple", new AppleFruitFactory());register.put("banana", new BananaFruitFactory());}public static AbstractFruitFactory getFactory(String factoryCode) {return register.get(factoryCode);}
}

使用

public class Sample {public static void main(String[] args) {AbstractFruitFactory appleFactory = new AppleFruitFactory();Fruit smallApple = appleFactory.smallFruit();smallApple.description();Fruit middleApple = appleFactory.middleFruit();middleApple.description();Fruit bigApple = appleFactory.bigFruit();bigApple.description();AbstractFruitFactory bananaFactory = new BananaFruitFactory();Fruit smallBanana = bananaFactory.smallFruit();smallBanana.description();Fruit middleBanana = bananaFactory.middleFruit();middleBanana.description();Fruit bigBanana = bananaFactory.bigFruit();bigBanana.description();}
}

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

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

相关文章

批量将 JSON 转换为 Excel/思维导入等其它格式

json 格式相信对大家来说都不陌生&#xff0c;这是一种轻量级的结构化数据&#xff0c;可以对对象进行描述。json 格式也是一种普通的文本文件格式&#xff0c;用记事本就能够打开编辑 json 格式的文件&#xff0c;可以很方便的转换为其他格式。今天要给大家介绍的就是如何将 j…

电脑有时出现检测不到音箱设备怎么办?

问题 有时候电脑开机之后就检测不到音箱&#xff0c;经过我一顿检查发现是检测不到声卡&#xff0c;即使拔插了音箱也没用&#xff0c;但是当我重启或者休眠之后再重启发现就检测到了 解决方案 方案一 重启或者休眠之后再开启 方案二 使用powershell指令将声卡弹出和载入…

Qwen-Agent框架的文件相关操作:从Assistant到BasicDocQA

在前面的几篇文章如《针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析&#xff1a;Agent基类篇》 、《基于Qwen-Agent框架的Function Call及ReAct方式调用自定义工具》、 《针对Qwen-Agent框架的源码阅读与解析&#xff1a;FnCallAgent与ReActChat篇》中&#xff0c…

RSSI定位程序,N个锚点、三维空间,使用CKF对轨迹进行滤波,附MATLAB代码的下载链接

本文所述的程序实现三维空间中基于RSSI信号的多锚点定位&#xff0c;并采用容积卡尔曼滤波&#xff08;CKF&#xff09;对动态轨迹进行降噪优化。代码包含完整的定位仿真流程&#xff0c;涵盖环境建模、信号强度模拟、定位解算、轨迹滤波及可视化分析模块 文章目录 程序介绍概述…

开源软件与自由软件:一场理念与实践的交锋

在科技的世界里&#xff0c;“开源软件”和“自由软件”这两个词几乎无人不知。很多人或许都听说过&#xff0c;它们的代码是公开的&#xff0c;可以供所有人查看、修改和使用。然而&#xff0c;若要细究它们之间的区别&#xff0c;恐怕不少朋友会觉得云里雾里。今天&#xff0…

C++ - 头文件基础(常用标准库头文件、自定义头文件、头文件引入方式、防止头文件重复包含机制)

一、头文件 在 C 中&#xff0c;头文件&#xff08;.h&#xff09;用于函数声明、类定义、宏定义等等 在 Visual Studio 中&#xff0c;头文件通常放在头文件目录中&#xff0c;头文件实现通常放在源文件目录中 二、常用标准库头文件 1、输入输出 <iostream> 标准输入…

CSS 背景属性学习笔记

一、CSS 背景属性概述 CSS 背景属性用于定义 HTML 元素的背景效果&#xff0c;主要包括以下几种属性&#xff1a; background-color&#xff1a;定义元素的背景颜色。 background-image&#xff1a;定义元素的背景图像。 background-repeat&#xff1a;定义背景图像如何重复…

Qt实现鼠标拖动窗口

Qt实现鼠标拖动窗口 1、设置窗口无边框2、重写鼠标点击&#xff0c;移动函数2.1添加头文件2.2 重写函数2.3 添加定义 3、定义一个偏移值4、判断鼠标左键是否按下并计算偏移值5、移动窗口6、.h文件和.cpp文件6.1 .h文件6.2 .cpp文件 7、总结 1、设置窗口无边框 this->setWin…

MDX语言的数论算法

MDX语言的数论算法探讨 引言 数论作为数学的一个重要分支&#xff0c;主要研究整数及其性质。在计算机科学和信息技术领域&#xff0c;数论算法被广泛应用于密码学、算法设计、数据加密等领域。MDX&#xff08;Multi-Dimensional Expressions&#xff09;语言&#xff0c;虽然…

【学Rust写CAD】34 精确 Alpha 混合函数(argb.rs补充方法)

源码 #[inline]pub fn over_exact(self, dst: Argb) -> Argb {let a 255 - self.alpha32();let t dst.rb() * a 0x80_00_80;let mut rb (t ((t >> 8) & Argb::MASK)) >> 8;rb & Argb::MASK;rb self.rb();// saturaterb | 0x1000100 - ((rb >&…

2025-04-06 NO.2 Quest3 基础配置与打包

文章目录 1 场景配置1.1 开启手势支持1.2 创建 OVRCameraRig1.3 创建可交互 Cube 2 打包配置 环境&#xff1a; Windows 11Unity6000.0.42f1 Quest3 开发环境配置见 2025-03-17 NO.1 Quest3 开发环境配置教程_quest3 unity 开发流程-CSDN博客。 1 场景配置 1.1 开启手势支持 …

LabVIEW提升程序响应速度

LabVIEW 程序在不同计算机上的响应速度可能存在较大差异&#xff0c;这通常由两方面因素决定&#xff1a;计算机硬件性能和程序本身的优化程度。本文将分别从硬件配置对程序运行的影响以及代码优化方法进行详细分析&#xff0c;帮助提升 LabVIEW 程序的执行效率。 一、计算机硬…

Matlab:三维绘图

目录 1.三维曲线绘图命令&#xff1a;plot3 实例——绘制空间直线 实例——绘制三角曲线 2.三维曲线绘图命令&#xff1a;explot3 3.三维网格命令&#xff1a;mesh 实例——绘制网格面 实例——绘制山峰曲面 实例——绘制函数曲线 1.三维曲线绘图命令&#xff1a;plot3 …

微信小程序基于Canvas实现头像图片裁剪(上)

序言 嘿&#xff0c;打工人混迹职场这么久&#xff0c;图片处理肯定都没少碰。不过咱说实话&#xff0c;大部分时候都是直接 “抄近道”&#xff0c;用现成的三方组件&#x1f60f;。就像我&#xff0c;主打一个会用工具&#xff0c;毕竟善用工具可是咱人类的 “超能力”&…

[特殊字符] 使用 Handsontable 构建一个支持 Excel 公式计算的动态表格

在 Web 应用中&#xff0c;处理表格数据并提供 Excel 级的功能&#xff08;如公式计算、数据导入导出&#xff09;一直是个挑战。今天&#xff0c;我将带你使用 React Handsontable 搭建一个强大的 Excel 风格表格&#xff0c;支持 公式计算、Excel 文件导入导出&#xff0c;并…

0302useState-hooks-react-仿低代码平台项目

文章目录 1 useState1.1 说明返回 1.2 示例1.3 数据类型 2 state2.1 概述2.2 state特点 3 state重构问卷4 immer结语 1 useState useState 是一个 React Hook&#xff0c;它允许你向组件添加一个 状态变量。 1.1 说明 语法 const [state, setState] useState(initialState…

前端实现单点登录(SSO)的方案

概念&#xff1a;单点登录&#xff08;Single Sign-On, SSO&#xff09;主要是在多个系统、多个浏览器或多个标签页之间共享登录状态&#xff0c;保证用户只需登录一次&#xff0c;就能访问多个关联应用&#xff0c;而不需要重复登录。 &#x1f4a1; 方案分类 1. 前端级别 SS…

zabbix监控网站(nginx、redis、mysql)

目录 前提准备&#xff1a; zabbix-server主机配置&#xff1a; 1. 安装数据库 nginx主机配置&#xff1a; 1. 安装nginx redis主机配置&#xff1a; 1. 安装redis mysql主机配置&#xff1a; 1. 安装数据库 zabbix-server&#xff1a; 1. 安装zabbix 2. 编辑配置文…

无人机等非合作目标公开数据集2025.4.3

一.无人机遥感数据概述 1.1 定义与特点 在遥感技术的不断发展中&#xff0c;无人机遥感数据作为一种新兴的数据源&#xff0c;正逐渐崭露头角。它是通过无人驾驶飞行器&#xff08;UAV&#xff09;搭载各种传感器获取的地理空间信息&#xff0c;具有 覆盖范围大、综合精度高、…

大数据时代的隐私保护:区块链技术的创新应用

一、引言 在当今数字化时代&#xff0c;大数据已经成为推动社会发展的关键力量。从商业决策到社会治理&#xff0c;从医疗健康到金融服务&#xff0c;数据的价值日益凸显。然而&#xff0c;随着数据的大量收集和广泛使用&#xff0c;隐私保护问题也日益突出。如何在充分利用大…