静态工厂模式(简单工厂模式)与动态工厂模式(工厂方法模式)

news/2024/9/18 12:53:47/ 标签: 简单工厂模式, 工厂方法模式

1. 简单工厂模式

核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下:

AbstractProduct

/** 产品接口 **/
public interface AbstractProduct {void doSomething();
}

Product1

public class ProductA implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productA");}
}

Product2 

public class ProductB implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productB");}
}

Factory 

/** 简单工厂 **/
public class SimpleFactory {public static AbstractProduct createProduct(String productName){AbstractProduct instance = null;switch (productName){case "A":instance = new ProductA();break;case "B":instance = new ProductB();break;}return instance;}
}

测试 

public class SimpleFactoryTest {public static void main(String[] args) {AbstractProduct productA = SimpleFactory.createProduct("A");productA.doSomething();AbstractProduct productB = SimpleFactory.createProduct("B");productB.doSomething();}
}

2. 工厂方法模式 

        和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:

AbstractProduct 

/** 产品接口 **/
public interface AbstractProduct {void doSomething();
}

Product1

/**  具体产品实现 **/
public class ProductA implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productA");}
}

Product2 

/**  具体产品实现 **/
public class ProductB implements AbstractProduct {@Overridepublic void doSomething() {System.out.println("i am productB");}
}

ConcreateFactory1 

/**  具体工厂实现 **/
public class FactoryA implements AbstractFactory {@Overridepublic AbstractProduct createProduct() {return new ProductA();}
}

ConcreateFactory2 

/**  具体工厂实现 **/
public class FactoryB implements AbstractFactory{@Overridepublic AbstractProduct createProduct() {return new ProductB();}
}

AbstractFactory 

/**  工厂接口 **/
public interface AbstractFactory {public AbstractProduct createProduct();
}

测试 

public class AbstractFactoryTest {public static void main(String[] args) {AbstractFactory factoryA = new FactoryA();AbstractProduct abstractProductA = factoryA.createProduct();abstractProductA.doSomething();AbstractFactory factoryB = new FactoryB();AbstractProduct abstractProductB = factoryB.createProduct();abstractProductB.doSomething();}
}


http://www.ppmy.cn/news/1520774.html

相关文章

热门跨境平台的IP代理如何选择?入局IP知识

在飞速发展的数字时代,拥有一个好的IP地址可以说是开展网络业务成功的关键之一。无论你是想在TikTok、Instagram还是Facebook上发展自己的业务,IP地址的选择都会对你的运营产生重要影响。让我们来深入了解一下什么是原生IP和住宅IP,以及它们对…

docker实战基础二(Docker基础命令)

一、Docker 镜像的标签 更改 Docker 镜像的标签(tag)可以通过 docker tag 命令来实现。这个命令允许你为现有的镜像创建一个新的标签。这对于组织和管理镜像非常有用,特别是在开发和部署工作流中。 命令语法 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]SOURCE_IMA…

python-实战4拆分pdf文件

Wps等软件拆分一份页数较多的PDF文件时,经常会出现要收费或者只能拆分其中几页的情况,下面我们就自己来写代码来实现这个收费功能。 课程中已经初步学习了如何将一个PDF文件拆分成总页数个子PDF文件,我们基于其中的思路进行改进&…

plugin-a: ERROR Missing publisher name.报错解决

在我编译项目扩展时,会报错如下 plugin-a: ERROR Missing publisher name. Learn more: https://code.visualstudio.com/api/working-with-extensions/publishing-extension#publishing-extensions 这是因为 VS Code 扩展要求在 package.json 中指定一个 publisher…

分享GoFly项目案例-降本增效数字化解决多仓库、动态仓库(车辆存储)、动态调调度、动态配送方案

前言 传统的生产原料企业在数字化转型中,需要到一个客户与产品配送(运输)管理及调度系统。系统要达到管理者可以看到产品数据,做业务的可以了解到货品库存、货品位置(可调度最近货品给客户)、货品配送情况…

python库pdf转word

要在 Python 中将 PDF 文件转换为 Word 文档(.doc 或 .docx 格式),您可以使用几个不同的库来实现这一目标。这里介绍几种常用的库及其使用方法: 1. 使用 pdf2docx pdf2docx 是一个流行的 Python 库,用于将 PDF 文件转换…

OpenHarmony Camera源码分析

一、简介 当前,开源在科技进步和产业发展中发挥着越来越重要的作用,OpenAtom OpenHarmony(简称“OpenHarmony”)赋予了开发者孕育创新的种子,也为数字化产业发展开辟了一片土壤。深开鸿是开源的坚定践行者&#xff0c…

力扣刷题(4)

正则表达式匹配 正则表达式匹配-力扣 思路来源:ithewei 若 *p 为空,*s 为空则匹配,*s 为非空则不匹配;当 *s为非空时,*p *s || *p ‘.’ 时第一个字符匹配;若 *(p1) ! ’ * 时,则递归判断…

深入解析 Spring Boot 中 MyBatis 自动配置的流程

在 Spring Boot 项目中,自动配置是一个非常强大的功能,可以极大简化配置工作。本文将通过 MyBatis 的自动配置为例,详细解析 Spring Boot 自动配置的整个流程,包括从 META-INF/spring.factories 文件到 mysql-connector-java 依赖…

Django+Vue社区养老管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者&…

SPI通信协议(软件SPI和硬件SPI)

今天介绍一种新的通信协议——SPI,相比于之前学习的I2C,SPI通信的速率更快,相对而言,需要的资源就比较多,SPI通信需要六根线:四根通信线,SCK(时钟线),MOSI&am…

三行五行的 SQL 只存在于教科书和培训班

教科书中 SQL 例句通常都很简单易懂,甚至可以当英语来读,这就给人造成 SQL 简单易学的印象。 但实际上,这种三行五行的 SQL 只存在于教科书和培训班,我们在现实业务中写的 SQL 不会论行,而是以 K 计的,一条…

前端使用Mock的场景与具体使用方法

在现代前端开发中,Mock技术扮演着至关重要的角色。无论是开发初期、测试阶段,还是在进行复杂的前后端分离开发时,Mock都能极大地提高开发效率和代码质量。本文将深入探讨前端开发中使用Mock的常见场景,并详细介绍具体的使用方法。…

Vue(七) TodoList案例1.0

文章目录 组件化编码流程(通用)1. 拆分静态组件2. 初始化列表展示动态数据如何让一个标签动态的拥有某一个属性 3. 按回车添加todo子组件给父组件传值之props 4. 勾选与取消勾选一个Todo5. 删除6. footer底部统计7. footer底部交互7.1 全选框自动打勾7.2 全选框取消勾选 8. 清除…

虚幻引擎VR游戏开发01 | VR设备和术语

四款Unreal Engine默认配套按键映射的VR设备 IMC按键映射 Oculus Touch (R) Grip Axis: 代表Oculus Rift或Quest设备的右手控制器的抓握轴输入。Valve Index (R) Grip Axis: 代表Valve Index设备的右手控制器的抓握轴输入。Vive (R) Grip: 代表HTC Vive设备的右手控制器的抓握…

力扣452-用最少数量的箭引爆气球(Java详细题解)

题目链接:452. 用最少数量的箭引爆气球 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法:局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最…

web前端-网页

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

RAG 实践- Ollama+RagFlow 部署本地知识库

前言 本文我们介绍另一种实现方式:利用 OllamaRagFlow 来实现,其中 Ollama 中使用的模型仍然是Qwen2 我们再来回顾一下 RAG 常见的应用架构 RagFlow的安装和部署 前置条件 CPU > 4 核RAM > 16 GBDisk > 50 GBDocker > 24.0.0 & Dock…

赛码网牛客在acm模式下利用node.js处理多行输入方法

赛码网在JS Node的语言下,acm模式的默认标准输入输出代码是这样的: const readline require(readline);const rl readline.createInterface({input: process.stdin,output: process.stdout }); rl.on(line, function (line) {const tokens line.spli…

qt配合halcon深度学习网络环境配置

1.开发环境qt6,编译器MSCV2019,网络是halcon的对象检测,halcon用20. 2.建立qt项目 3.到halcon安装目录下复制include,lib这两个文件夹到qt项目中进行引用 4.引用到halcon静态库后,到halcon运行目录下找到静态库对应dll文件&…