工厂模式的实现

【设计模式】基于 Java 语言实现工厂模式 简单⼯⼚模式是⼀种创建型设计模式,但并不属于23种设计模式之⼀,更多的是⼀种编程习惯。将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。简单⼯⼚模式的角色:描述产品的通⽤⾏为,通常由一个 Java 接口或一个 Java 抽象类定义。具体产品:实现抽象产品接⼝或继承抽象产品类。负责创建产品,根据传递的不同参数创建不同的产品示例。 阅读详情

工厂模式是一种设计思想,它适用于需要创建多个具体实例的场景,并且这些实例都具有一个共同的方法(动作)。比如,“发送信息”。我们都知道,发送信息的方式有很多种,但无论是用微信发送,还是用邮件发送,它们都有一个共同的动作,就是“发送”,那么可以把这个动作(send)抽象出来。
1.普通工厂模式
抽象的动作:

package com.itant.pattern.sender;
public interface Sender {
	void send();
}

具体的实现:

package com.itant.pattern.sender;
public class EmailSender implements Sender {

	@Override
	public void send() {
		System.out.println("用邮件发送");
	}
}
package com.itant.pattern.sender;
public class WechatSender implements Sender {
	
	@Override
	public void send() {
		System.out.println("用微信发送");
	}
}

经过以上的步骤,发送的动作有了,还差一个“工厂”来生成这些具体的发送动作:

package com.itant.pattern;

import com.itant.pattern.sender.EmailSender;
import com.itant.pattern.sender.Sender;
import com.itant.pattern.sender.WechatSender;

public class CommonFactory {
	public Sender generateSender(String type) {
		if (type.equals("email")) {
			return new EmailSender();
		} else if (type.equals("wechat")) {
			return new WechatSender();
		} else {
			return null;
		}
	}
}

测试:

package com.itant.pattern;
import com.itant.pattern.sender.Sender;

public class Test {

	public static void main(String[] args) {
		// 普通工厂模式
		CommonFactory commonFactory = new CommonFactory();
		
		Sender wechatSender = commonFactory.generateSender("wechat");
		wechatSender.send();
		
		Sender emailSender = commonFactory.generateSender("email");
		emailSender.send();
	}
}

2.多个工厂方法模式
以上的普通工厂模式有个缺点,就是参数传错了的话,可能返回的Sender会为null,引起空指针异常等情况,虽然可以做一些判断去“补救”,但这样的设计是有缺陷的,不建议在设计的时候用,要想规避这种情况,那么我们就不要传参了,直接使用指定的方法生成指定的Sender即可,我们改造一下Factory:

package com.itant.pattern;

import com.itant.pattern.sender.EmailSender;
import com.itant.pattern.sender.Sender;
import com.itant.pattern.sender.WechatSender;

public class MultiFactory {
	public Sender generateWechatSender() {
		return new WechatSender();
	}
	
	public Sender generateEmailSender() {
		return new EmailSender();
	}
}

测试:

package com.itant.pattern;
import com.itant.pattern.sender.Sender;

public class Test {

	public static void main(String[] args) {
		
		MultiFactory multiFactory = new MultiFactory();
		Sender wechatSender = multiFactory.generateWechatSender();
		wechatSender.send();
		
		Sender emailSender = multiFactory.generateEmailSender();
		emailSender.send();
	}
}

这样确实是可以避免参数传错的情况了,但我们可以进一步优化,在多个工厂方法模式的基础上进行优化,于是引入静态工厂模式。

3.静态工厂模式
同样是改造Factory,在多个工厂方法模式的基础上,把方法改成static的,这样就可以省略实例化工厂的步骤:

package com.itant.pattern;

import com.itant.pattern.sender.EmailSender;
import com.itant.pattern.sender.Sender;
import com.itant.pattern.sender.WechatSender;

public class StaticFactory {
	public static Sender generateWechatSender() {
		return new WechatSender();
	}
	
	public static Sender generateEmailSender() {
		return new EmailSender();
	}
}

测试:

package com.itant.pattern;
import com.itant.pattern.sender.Sender;

public class Test {

	public static void main(String[] args) {
		Sender wechatSender = StaticFactory.generateWechatSender();
		wechatSender.send();
		
		Sender emailSender = StaticFactory.generateEmailSender();
		emailSender.send();
	}
}

好的,目前为止,似乎一切还不错,大多数情况下,使用静态工厂模式即可,因为它确实是满足开发需求的,而且也比较简洁清晰。但是有一个问题就是,每次有新的实例都要修改我们的工厂类,例如有一天,新增了一个发送方式–“QQSender”,这个时候,我们必然要修改StaticFactory,新增一个generateQQSender()的方法,这样是违背了设计模式的“开闭原则”的,即:我们希望对扩展开放,对修改关闭。于是引入终极的抽象工厂模式:

4.抽象工厂模式
抽象工厂模式同样是对工厂进行改造。最开始的时候,我们就对“发送”这个动作进行了抽象,举一反三,我们同样也可以对工厂频繁“生产”这个动作进行抽象:

package com.itant.pattern.factory;

import com.itant.pattern.sender.Sender;

public interface Factory {
	Sender generateSender();
}

然后我们需要什么样具体的工厂的话就可以自行扩展:

package com.itant.pattern.factory;

import com.itant.pattern.sender.Sender;
import com.itant.pattern.sender.WechatSender;

public class WechatFactory implements Factory {

	@Override
	public Sender generateSender() {
		// TODO Auto-generated method stub
		return new WechatSender();
	}
}
package com.itant.pattern.factory;

import com.itant.pattern.sender.EmailSender;
import com.itant.pattern.sender.Sender;

public class EmailFactory implements Factory {

	@Override
	public Sender generateSender() {
		// TODO Auto-generated method stub
		return new EmailSender();
	}
}

测试:

package com.itant.pattern;

import com.itant.pattern.factory.EmailFactory;
import com.itant.pattern.factory.Factory;
import com.itant.pattern.factory.WechatFactory;
import com.itant.pattern.sender.Sender;

public class Test {
	public static void main(String[] args) {
		Factory wechatFactory = new WechatFactory();
		Sender wechatSender = wechatFactory.generateSender();
		wechatSender.send();
		
		Factory emailFactory = new EmailFactory();
		Sender emailSender = emailFactory.generateSender();
		emailSender.send();
	}
}

这样,我们就得到了相对比较完整的工厂模式。抽象工厂模式适用于某种动作有多种实现方式(某种操作有多种实现方案)的情况,扩展方便、灵活,如果非要说缺点,就是工厂类的增加,每新增一种操作,都需要新增一个对应的工厂类,在简单的项目中似乎显得冗余,但是在复杂的项目中则可以让条理非常清晰,所以,在实际使用过程中,可以针对项目的复杂情况而采用相应的工厂模式,在简单的小项目中,可以直接使用静态工厂模式,在复杂的项目中,推荐使用抽象工厂模式。

EMB电子机械制动系统冗余备份方案介绍 随着汽车智能化技术的快速发展,自动驾驶技术的不断升级,对车辆制动系统的可靠性和安全性提出了更高要求。根据国际汽车安全法规(如UN R13-H)的最新修订,L3级及以上自动驾驶车辆必须配备具有冗余功能的制动系统,以确保在任何单一故障发生时仍能维持部分或全部制动能力。本文重点讨论最具前瞻性的EMB(电子机械制动)系统的冗余备份设计方案 阅读详情

相关推荐

AD56XXR系列DAC驱动设计:SPI接口、寄存器配置与嵌入式工程实践

数模转换器(DAC)是嵌入式系统实现高精度模拟控制的核心器件,其性能取决于通信协议可靠性、寄存器配置准确性及硬件协同设计能力。基于SPI总线的电压输出型DAC广泛应用于工业控制、光模块偏置、传感器校准等场景,需兼顾静态精度、动态响应与低功耗特性。AD56XXR系列作为典型集成内部基准与多通道同步更新能力的12/14/16位DAC,支持轨到轨输出与灵活掉电模式,为资源受限MCU提供可移植固件范式。本文围绕SPI时序约束、16位指令字解析、LDAC同步机制及精度补偿策略展开,覆盖从硬件连接、初始化流程到量产级可

weixin_33481022的博客 611

三十二、微服务之-工厂模式

工厂模式是一种创建型设计模式,它提供了一种方法来实例化对象,而不是直接使用 new 关键字。在工厂模式中,我们定义一个工厂类,该类负责创建特定类型的对象,并将对象的创建逻辑封装在其中。通过使用工厂模式,我们将对象的创建过程从客户端代码中分离出来,并使客户端不需要关心具体的实例化过程。方法可以根据传入的参数执行一些复杂的逻辑,比如根据不同的参数创建不同的对象,但在本例中,我们只是简单地创建一个。最后,我们使用工厂模式创建了两个不同品牌和颜色的汽车对象,并输出它们的品牌和颜色信息。,该类具有品牌和颜色属性。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 509

AI for Science:GNN预测分子性质全流程详解与工业实践

从分子表示到工业落地,一文掌握图神经网络在药物研发与材料设计中的核心实战近年来,的浪潮正深刻变革着传统科研范式。在药物研发与材料设计领域,作为核心环节,已从传统的实验试错转向基于图神经网络(GNN)的智能计算。本文将深入解析GNN预测分子性质的,涵盖数据准备、模型设计、训练优化到工业部署,并揭秘前沿技术与实战案例。

datacanvas2426的博客 1674

工厂模式之3种实现方式

目录(一) 工厂模式概述(二) 简单工厂模式(三) 工厂方法模式(四) 抽象工厂模式(五) 总结 (一) 工厂模式概述 工厂模式: 是Java中最常用的设计模式之一, 它提供了一种创建对象的最佳方式. 在工厂模式中, 我们在使用工厂类创建对象时 不会对客户端暴露 创建逻辑, 并且是通过使用一个共同的接口来指向新创建的对象 (二) 简单工厂模式 简单工厂模式: 定义一个创建对象的工厂类, 由工厂类决定创建出哪一种对象的实例, 工厂类内部已封装创建出哪一种对象的实例的逻辑代码 Phone 手机接口 inter

Admin_Lian的博客 1334

【车间调度】车间调度问题的分类

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。 车间调度问题的分类 根据工件和车间构成不同,车间调度问题可分为以下几种 1.单机调度问题 在单机调度问题(S,SMP)中,加工系统只有一台机床,待加工的工件有且仅有一道工序,所有工件都在该机床上进行加工。此问题是最简单的调度问题,当生产车间出现瓶颈机床时的调度就可视为此调度问题。 ...

weixin_51656605的博客 7430

【FPGA】Robei EDA的使用(10)————如何更新EDA的使用license

#海卑而下,能聚众水;学问笃实,以生光辉。 有的时候,有些问题自己通过查找资料解决,宁愿磨难一下,走点弯路,但收获更深刻的认知;不过,有些问题,问一下别人,可能会避免自己耗费过多时间做无用工,这些问题问会的人是极好的。但是怎样把握这个问题的类型,大约只能靠经验了~ (问我为何出此感言,谁叫我纠结了两天的问题,被人家一句话解决,我这个恨啊) ————————————————————正文开始的分割线———————————————— Robei EDA在使用上会有一个注册码,这个license在获取之后,每一次的

Ninquelote的博客 1004

设计模式:工厂方法模式(java实现)

工厂方法模式和简单工厂模式比较:工厂方法模式跟简单工厂模式在结构上的不同是很明显的,工厂方法模式的核心是一个抽象工厂类,而简单工厂模式的核心在一个具体类。显而易见工厂方法模式这种结构更好扩展,权力下发,分布式比集中式更具优势。如果系统需要加入一个新的产品,那么所需要的就是向系统中加入一个这个产品类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的产品类而言,这个系统完全支持开闭原则。

maligebilaowang的博客 481

【FPGA】AD9653设计和调试总结

基于FPGA的AD9653设计,设计思路,注意事项

weixin_41246509的博客 7595

工厂模式的实现(Java)

1、概述

catch_dreamer的博客 3029

现代SerDes解剖:从CTLE/DFE到PAM4与ADC+DSP架构

高速有线通信的物理层瓶颈,正从并行总线的时钟偏斜转向串行链路的信号完整性挑战。SerDes作为解决这一问题的核心技术,其内部架构远超“并转串”的朴素认知。接收端的CTLE线性均衡与DFE判决反馈均衡,配合CDR时钟恢复,共同构成对抗信道损耗与码间干扰的关键机制。随着速率迈向56G/112G,PAM4调制以电平幅度换取带宽,而ADC+DSP架构则把均衡算法搬入数字域,实现更灵活的非线性补偿。理解这些模块如何协同工作,是调试PCIe、以太网等高速链路、优化眼图余量与抖动预算的基础,也是硬件工程师从盲目调参走向系

weixin_29194817的博客 299

基于 YOLOv26 的食品包装缺陷检测系统:智能视觉质检方案

本文提出了一种基于YOLOv26深度学习的食品包装缺陷智能检测系统。该系统能够自动识别多种常见包装缺陷,包括密封不良、破损、污染、标签错误等8类问题。相比传统人工检测方法,该系统具有高精度、多类别分类、实时推理等优势。文章详细介绍了系统架构,包含数据采集、预处理、YOLOv26检测模型和后处理四个核心模块,并提供了完整的环境配置和数据处理代码实现。该系统为食品包装行业提供了一种高效、准确的智能视觉质检解决方案。

一键难忘的博客 685

三种工厂模式的C++实现

引出工厂模式的设计问题◆ 1.为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题 n 多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如 new ×××;的代码。这里带来两个问题:客户程序员必须知道实际子类的名称(

爱冒险的技术宅 3万+

ArcGIS实验教程——实验十七:缓冲区分析(Buffer Analysis)

【实验描述】缓冲区(Buffer)是为了识别某一地理实体对周围地物的影响而在其周围建立的一定宽度多边形区域,缓冲区分析(Buffer Analysis)是用来确定不同地理要素的空间临近性或接近程度的一种分析方法。作为GIS的空间分析方法之一,缓冲区分析的应用范围特别广泛,常用于分析矢量实体对周围的影响。例如,工厂排放的废水废气所影响的空间范围等等。 一、缓冲区的基本概念 1、缓冲区 是地理空间目标的一种影响范围或服务范围。 2、缓冲区分析 指根据分析对象的点、线、面实体,自动建立它们周围一定距离的带

智慧空间实验室 1万+

Java实现工厂模式

简单工厂模式,又叫做静态工厂模式(Static Factory Method),由一个工厂对象决定创建出哪一种产品类的实例,传递一个参数进入静态工厂类,然后根据参数动态决定应该创建哪一个产品类。简单工厂模式是另外两种工厂的基础,通过了解简单工厂模式可以让我们对另外两种设计思路有更深入的理解和掌握工厂方法模式是对简单工厂模式的进一步抽象化。简单工厂的对象创建是在工厂类中实现的,而工厂方法模式将对象的创建延迟到子类中进行,从而实现了更好的扩展性,维护起来会更方便。

G81948577的博客 1552

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

三大工厂模式的代码实现及总结

转载请注明出处 作者:@LSZJXin 说明:本文借助冰激凌的例子,通过Java来实现三大工厂模式,代码运行无误。由于本人水平有限,如有不正确的地方,欢迎留言指出。谢谢! 简单工厂模式、工厂方法模式、抽象工厂模式,都是属于创建型设计模式。严格上来说,简单工厂模式不属于23设计模式之一,因为它违背了开闭原则。这三种设计模式,名字都包含“工厂”二字,如果没有认真地对它们的设计思...

ZJXin 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

三种工厂模式Java实现

一、题目分析 (1)、简单工厂模式 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。 (2)、工厂方法模式 海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂...

weixin_42578646的博客 1814

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

设计模式C++实现(1)——工厂模式

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。

wuzhekai的专栏 17万+

C++实现工厂模式及解析

工厂模式 1 工厂方法模式 1.1 定义以及作用 通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。工厂方法使一个类的实例化延迟到其子类,即由子类来决定应该实例化(创建)哪一个类 1.2 特点 克服了简单工厂的缺点:违背了开放-封闭原则的缺点 工厂方法模式将具体产品的创建推迟到工厂类的子类(具体工厂)中,工厂父类不在负责所有产品的创建,而只是给出具体工厂必须实现的接口。工厂...

会飞的鱼的博客 1101

python如何代替工厂模式_工厂模式的python实现

#1.什么是工厂模式#2.工厂模式的分类'''1. 简单工厂模式2. 工厂方法模式3. 抽象工厂方法模式'''#3.简单工厂模式的python实现from abc import ABCMeta, abstractmethodclass Animal(metaclass=ABCMeta):@abstractmethoddef do_say(self):passclass Dog(Animal):de...

weixin_39981041的博客 120

【设计模式】用Java实现工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,将对象的实例化过程封装在工厂类中,使得客户端代码与具体对象的创建过程解耦。工厂模式基于一个简单的原则:将对象的创建与使用分离。它通过引入一个工厂类,将对象的实例化过程集中在工厂类中,并提供一个统一的接口供客户端使用,从而降低了客户端与具体对象之间的依赖关系。抽象产品(Abstract Product):定义了产品的共同接口,所有具体产品都实现了这个接口。

分享Java硬核干货 1万+

C++实现工厂模式

实现工厂模式 简单工厂模式(以创建图形为例) 定义与概念: 简单工厂模式把对象的创建逻辑封装在一个工厂类中,通过传入不同的参数,由工厂类决定创建哪种具体的产品对象,使得客户端代码不需要了解具体产品的创建细节。 实现步骤: 定义产品抽象基类(以图形为例): class Shape { public: virtual void draw() = 0; virtual ~Shape() {} }; 实现具体产品类(圆形和矩形): class Circle : public

2302_81041084的博客 634

工厂模式(TS实现)

工厂模式是一种,它提供了一种的方式,使得客户端不需要直接实例化对象,而是通过工厂类来创建所需的实例。

weixin_62061392的博客 1301

c++实现简单工厂、工厂方法、抽象工厂模式

c++实现简单工厂、工厂方法、抽象工厂模式: 题目描述: (1)、简单工厂模式 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。 #include<iostream> using...

qq_40728028的博客 359

三大工厂模式——C++实现

以通俗易懂的大白话配合具体的C++代码示例介绍了三种工厂模式以及它们的优劣

T_killer_的博客 1005

工厂模式C++实现

简要描述工厂模式中常用的三种工厂模式方法。

Huuaaaaa的博客 1005

【设计模式】 工厂模式介绍及C代码实现

工厂模式是一种创建型设计模式,它提供一种通用的接口来创建对象,但是让子类决定实例化哪个类。工厂模式将对象的创建过程封装在一个工厂类中,避免直接调用构造函数,提高代码的灵活性和可维护性。工厂模式实现了依赖倒置原则,即面向接口编程而不是面向实现编程。在工厂模式中,有一个抽象工厂接口,定义了工厂类应该实现的方法,以及一组产品接口,定义了工厂类应该创建的产品的通用行为。具体的工厂类实现了抽象工厂接口,用于创建具体的产品对象。工厂模式可以分为三种不同的类型:简单工厂模式、工厂方法模式和抽象工厂模式。

物联网布道师 1063
上一篇: Android USB(OTG) 删除文件的探索过程
下一篇: Linux下SVN服务器搭建
ithouse
博客等级 码龄12年 200粉丝 212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值