设计模式的学习——工厂模式

Figma汉化教程 阅读详情

创建模式------Factory模式

定义:工厂模式属于创建型的设计模式,他提供了一种创建对象的最佳方式。它主要是为创建对象提供过渡的接口,以便将创建 对象的具体过程屏蔽隔离起来,已达到高灵活性的目的。

工厂模式根据抽象程度的不同可以分成三种:

  1. 简单工厂模式(也叫静态工厂模式):实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或者接口)的实例。
  2. 工厂方法模式(也叫多形性工厂):工厂方法是粒度很小的设计模式,因为模式表现只是一种抽象方法。提前定义用于创建对象的接口,让子类决定实例化具体的某个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,有接口针对不同的条件返回具体的类实例,由具体的类实例去实现。
  3. 抽象工厂模式(也叫工具箱):当有多个抽象角色时使用抽象工厂模式。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体情况下,创建多产品对象。它有具体产品类,每个抽象产品产品类可以派生出多个具体产品类,一个抽象工厂类可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。

为何使用:

工厂模式是我们最常用的模式,它实现了创建者和调用者的分离。工厂模式在java程序系统中可以说是随处可见。那为什么工厂模式如此常用呢?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A();工厂模式也是用来创建实例对象的,所以以后new时要多动脑子想一想,是否可以考虑使用工厂模式。当然如果使用工厂模式,可能会多做一些工作,但是会给你的系统带来更大的可扩展性和尽量少的修改。也就是说,它的好处在后阶段是可以体现出来的。

用工厂方法代替new操作。将选择实现类,创建对象统一管理和控制。

简单工厂模式实例:

public class SampleFactory {
	//定义一个Car接口
	public interface Car{
		void run();
	}
	//奥迪
	static class Audi implements Car{
		@Override
		public void run() {
			System.out.println("奥迪在路上");
		}
	}
	//比亚迪
	static class Byd implements Car{
		@Override
		public void run() {
			System.out.println("比亚迪在路上");
		}	
	}
	//汽车工厂类,可以创建各种汽车对象
	static class CarFactory{
		public static Car createAudi(){
			return new Audi();
		}
		public static Car createByd(){
			return new Byd();
		}
	}
	//测试
	public static void main(String[] args) {
		
		Car c1=new Audi();
		Car c2=new Byd();
		c1.run();
		c2.run();
		/*
		 * 以上代码总结:我们发现调用者需要和Car Byd Audi三个类打交道,
		 * 如果我们增加奔驰,那么调用者也要新增奔驰类。显然,调用者和三个
		 * 类的耦合性太强了,这违反了开闭原则(对修改关闭,对扩展开放)
		 */
		Car c11=CarFactory.createAudi();
		Car c22=CarFactory.createByd();
		c11.run();
		c22.run();
		/**
		 * 简单工厂的方法总结:调用者只需要知道CarFactory和Car接口就行; 
		 * 至于下面有多少实现类,和调用者无关。当需要车对象时,只需要和
		 * CarFactory打交道,获得新创建的对象即可
		 */	
	}

}

工厂方法模式实例:

public class Factory {
	//抽象的产品类,定义一个Car交通工具类。接口中的所有方法都是静态的
	public interface Car{
		void gotowork();
	}
	/**
	 * 定义实际的产品类,总共定义两个,bike和bus。分别表示不同的交通工具
	 * 因为写在一个文件里,为了在main()方法中可以调用,使用了static
	 */
	static class Bike implements Car{

		@Override
		public void gotowork() {
			System.out.println("骑自行车去上班!");
		}
		
	}
	static class Bus implements Car{

		@Override
		public void gotowork() {
			System.out.println("坐公共汽车上班!");
		}		
	}
	//定义抽象工厂接口
	public interface ICarFactory{
		Car getCar();
	}
	//具体的工厂类,分别为每个具体的产品创建不同的工厂子类
	static class BikeFactory implements ICarFactory{
		@Override
		public Car getCar() {
			return new Bike();
		}
		
	}
	static class BusFactory implements ICarFactory{
		@Override
		public Car getCar() {
			return new Bus();
		}	
	}
	public static void main(String[] args) {
		ICarFactory factory=null;
		//bike   通过工厂类创建具体的实例
		factory=new BikeFactory();
		Car bike =factory.getCar();
		bike.gotowork();
		
		//bus
		factory=new BusFactory();
		Car bus=factory.getCar();
		bus.gotowork();
	}

}

工厂方法模式实例总结分析:

工厂模式的优点:1、一个调用者想要创建一个对象,只要知道其名称就可以了,降低了耦合度。2、扩展性高,如果增加一个产品,只要扩展一个工厂类就可以了。使得代码结构更加的清晰。3、屏蔽产品的具体实现,调用者只关心产品的接口。

工厂模式的缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂(这里可以使用反射机制来避免),使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。所以对于简单对象来说,使用工厂模式反而增加了复杂度。

抽象工厂模式实例:

public class AbatractFactory {
	//定义一个形状的接口
	public interface Shape{
		void draw();
	}
	//创建实现接口的实体类
	static class Rectangle implements Shape{
		@Override
		public void draw() {
			System.out.println("矩形类的draw()方法!");
		}	
	}
	static class Square implements Shape{

		@Override
		public void draw() {
			System.out.println("正方形中的draw()方法!");
		}
	}
	static class Circle implements Shape{

		@Override
		public void draw() {
			System.out.println("圆形中的draw()方法!");
		}
		
	}
	
	//为颜色创建一个接口
	public interface Color{
		void fill();
	}
	//创建实现接口的实体类
	static class Red implements Color{
		@Override
		public void fill() {
			System.out.println("红色类中的fill()方法!");
		}
	}
	static class Green implements Color{

		@Override
		public void fill() {
			System.out.println("绿色类中的fill()方法!");
		}	
	}
	static class Blue implements Color{

		@Override
		public void fill() {
			System.out.println("蓝色类中的fill()方法!");
		}		
	}
	
	//为Color和Shape对象创建抽象类来获取工厂
	static abstract class AbstractFactory{
		abstract Color getColor(String color);
		abstract Shape getShape(String shape);
	}
	
	//创建拓展了AbstractFactory的工厂类,基于给定的信息生成实体类的对象
	static class ShapeFactory extends AbstractFactory{

		@Override
		Color getColor(String color) {
			return null;
		}

		@Override
		Shape getShape(String shapeType) {
			if(shapeType==null){
				return null;
			}
			//equalsIgnoreCase忽略大小写比较字符串
			if(shapeType.equalsIgnoreCase("CIRCLE")){
				return new Circle();
			}else if(shapeType.equalsIgnoreCase("RECTANGLE")){
				return new Rectangle();
			}else if(shapeType.equalsIgnoreCase("SQUARE")){
				return new Square();
			}
			return null;
		}
		
	}
	static class ColorFactory extends AbstractFactory{

		@Override
		Color getColor(String color) {
			if(color==null){
				return null;
			}else if(color.equalsIgnoreCase("red")){
				return new Red();
			}else if(color.equalsIgnoreCase("green")){
				return new Green();
			}else if(color.equalsIgnoreCase("blue")){
				return new Blue();
			}
			return null;
		}

		@Override
		Shape getShape(String shape) {
			// TODO Auto-generated method stub
			return null;
		}
		
	}
	
	//创建一个工厂创造器,通过传递形状或者颜色来获取工厂
	static class FactoryProducer{
		public static AbstractFactory getFactory(String choice){
			if(choice.equalsIgnoreCase("shape")){
				return new ShapeFactory();
			}else if(choice.equalsIgnoreCase("color")){
				return new ColorFactory();
			}
			return null;
		}
	}
	
	//使用FactoryProducer来获取AbstractFactory,通过传递类型信息来获取实体类的对象
	public static void main(String[] args) {
		//通过FactoryProducer工厂构造器获取形状工厂
		AbstractFactory shapeFactory=FactoryProducer.getFactory("shape");
		//通过形状工厂获取形状为 Circle 的对象
	        Shape shape1 = shapeFactory.getShape("CIRCLE");
	        //调用 Circle 的 draw 方法
	        shape1.draw();

	        //获取形状为 Rectangle 的对象
	        Shape shape2 = shapeFactory.getShape("RECTANGLE");
	        //调用 Rectangle 的 draw 方法
	        shape2.draw();
	      
	        //获取形状为 Square 的对象
	        Shape shape3 = shapeFactory.getShape("SQUARE");
	        //调用 Square 的 draw 方法
	        shape3.draw();

	        //获取颜色工厂
	        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
	        //获取颜色为 Red 的对象
	        Color color1 = colorFactory.getColor("RED");
	        //调用 Red 的 fill 方法
	        color1.fill();

	        //获取颜色为 Green 的对象
	        Color color2 = colorFactory.getColor("Green");
	        //调用 Green 的 fill 方法
	        color2.fill();
	       
	       //获取颜色为 Blue 的对象
	       Color color3 = colorFactory.getColor("BLUE");
	       //调用 Blue 的 fill 方法
	       color3.fill();
	}

}

总结:

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

 

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

工厂模式的适用场景:

  1. 一个对象拥有很多的子类;
  2. 创建某个对象时需要进行许多的额外操作;
  3. 系统后期需要经常的扩展,那把对象实例化的任务交由实现类完成,扩展性好。

面向对象的原则:面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派切割成每一段,将为一段再封装起来(减少段与段之间的耦合联系性),这样就可以将风险分散,以后要是需要修改,只要更改每一段,不会发生牵一动百的事情。

 

总结:无论是简单工厂模式,工厂方法模式还是抽象工厂模式,他们的本质都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度的复用。究竟使用哪种设计模式要根据业务需求来决定。

 

 

 

芋道前后端分离项目跳过登录 在此页面中可以看到当在没有获取到token时,如果此页面在白名单中则直接进入,所以我们将刚刚配置在。在此路径下配置需要跳过登录的页面路径,记住path中编辑的名称。根据以上两图可以发现芋道的。将所有需要跳过登录的方法。,否则会提示登录状态过期。至此完成免登录进入页面。 阅读详情

相关推荐

立创EDA + AI 生成 STM32 原理图教程1

AI辅助立创EDA设计STM32原理图教程摘要 本教程系统介绍如何利用AI工具(如Claude Code、DeepSeek等)与立创EDA专业版结合,实现STM32原理图的智能生成与优化。主要内容包括: 技术架构:采用分层设计,AI生成结构化网表数据,由立创EDA执行确定性绘图,确保可审查性 环境搭建:详细说明立创EDA专业版、Node.js等工具的安装配置 五种AI集成方案:包括官方AI Skill、MCP Server等不同实现方式 核心功能: 自动提取STM32引脚定义 智能元件选型与LCSC编号匹配

shihui2003的博客 1514

数字化时代,TO B业务如何进阶?

英国社会学家齐格蒙特·鲍曼(Zygmunt Bauman)在“液态社会”的概念中指出,当今世界,个体与环境关系变动不断,一直处于“流动”状态。 这一概念在2020年体现得尤为明显。新冠疫情“黑天鹅”事件频发、国际局势发生巨变……未来正处于不断的变动之中。 商业世界同样处于“流动”之中。 一边是旧的商业模式正在被打破重塑,商业世界的风向发生变化;另一边是新型业态和商业模式的兴起,无线医疗机器人、远程云会议、5G驱动智能传感器、VR互动、直播等基于5G的数...

weixin_58342023的博客 479

Go-zero微服务实战:从零搭建电商用户系统(含完整代码示例)

本文详细介绍了如何使用go-zero框架从零搭建电商用户系统,包含完整的微服务架构设计、核心功能实现代码示例以及性能优化策略。通过分层架构设计、JWT认证、分布式锁等关键技术,实现高并发、高可用的用户系统,适用于电商平台开发。

weixin_29275257的博客 253

【设计模式学习】单例模式和工厂模式

设计模式是在软件设计中反复出现的问题和解决方案的经验总结。它是对软件设计中常见问题的通用解决方案,可以帮助设计人员更高效地解决问题,并提高软件设计的质量和可维护性。设计模式提供了一种在特定情况下的解决方案,它们可以被反复使用,并且是经过验证的最佳实践。设计模式可以帮助开发人员更好地理解软件设计中的问题,并为他们提供一种标准的方法来解决这些问题。通俗易懂的一点来说:就是提高你的下限。

xiaoxie8023的博客 3001

MaxDEA如何计算超效率DEA

MaxDEA如何计算超效率DEA第一步,导入数据,设置输出和输出,点击OK;第二步,运行模型; 本文计算的是超效率DEA-BCC。 第一步,导入数据,设置输出和输出,点击OK; 第二步,运行模型; 在distance选项框中选择Radial:CCR(1978);BCC(1984)。 在Orientation中选择Non-oriented。其中,Input-oriented是投入最小;Outp...

王樰沫 1万+

跟着团子学SAP:SAP用户状态管理详解(含权限分配等) OK02

SAP用户状态详细配置逻辑及解析

Lucas1211的博客 3万+

设计模式学习总结——工厂模式

在我们平常创建对象的时候,都是通过关键字 new 来实现的,例:Class A = new A()。在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、...

淘系技术 5549

Creo二次开发环境配置与DLL项目实战指南(Creo8.0+VS2019)

本文详细介绍了Creo8.0与VS2019环境下的二次开发配置与DLL项目实战指南,涵盖环境准备、版本匹配、DLL项目创建、核心代码编写、部署调试及常见报错处理。重点解析了Creo二次开发中的关键配置和优化技巧,帮助开发者高效解决实际问题。

weixin_28432777的博客 516

跟着ChatGPT学习设计模式 - 工厂模式

1. 前言 在工作过程中,越发觉得设计模式的重要性。经常会有人说工作5年的人,大学生随便培训1-2月也能做同样的工作,没错,大学生的确可以做。 但其写的代码,可维护性、可扩展性、添加新功能时方便还是简单。甚至是软实力的表现,如何沟通、如何推进项目进展、如何做项目排期,其实都是应届生所不具备的。(当然工作5年的人和大学生没不一样的,那你就应该被社会所淘汰,不裁你,裁谁呢) 大家不需要趾高气昂,但也...

weixin_41425448的博客 190

【论文复现】——基于欧式聚类的车载点云道路提取

针对车载激光点云道路信息提取的问题,提出了一种基于欧式聚类的道路提取方法。首先通过统计滤波去除噪点以免对后续处理结果产生影响,然后用坡度滤波去除路坎点,使道路边界与人行道、绿化带等与路坎相连的地物形成10~25 cm的高程阶跃,最后用欧式聚类将路面点云与其他地物点云聚类为一簇或多簇并保留道路簇,从而实现道路点云的精确提取。

点云侠的博客 1134

使用Android Studio调试系统应用之TvSettings(一):移植

对于做ROM的同仁、以及想要深入学习Android同学,必定会去调试Android的系统APK,而 *aosp* 源码中的系统APK源码,无法直接在Android Studio中进行调试,本文将持续更新细节,手把手教你,使用Android Studio调试安卓的系统应用。在每个阶段,提供知识点的梳理、总结,为您答疑解惑!

上周的博客 2054

设计模式学习总结(1)简单工厂模式、工厂方法模式、抽象工厂模式

设计模式学习 做了几个项目,发现设计模式的好处还是很多的,这东西就是只有你真正用到的时候才知道他的好处,否则学了也不知道所以然。所以设计模式学习我认为可以在先进行几个项目后,再来学习,这样学习的效果和感受才是最好的。 这次是做一个学习的笔记,内容还是主要以我看的两本书《大话设计模式》、《head first 设计模式》,以及我在网上找到的一些内容为主,还有就是附带的一些自己的感悟(这些有可能是...

anyue0205的博客 420

YOLOv13零基础手把手教程:在 YOLOv13 中集成 SFSConv,YOLOv13让目标检测更上一层楼

YOLOv13本教程详细介绍了如何在YOLOv13中集成SFSConv模块以提升目标检测性能。YOLOv13 SFSConv创新性地结合了分数伽柏滤波和分数傅里叶变换,通过空间处理单元(SPU)和频率处理单元(FPU)解耦处理特征。实验表明,该模块可使准确率提升5.21%,mAP提高11.45%。教程从原理分析到代码实现,系统讲解了SFSConv的数学基础、模块设计,并提供了在YOLOv13中集成该模块的详细步骤,包括配置文件修改、核心代码实现等。

FJN110的博客 2175

设计模式学习之——工厂模式

设计模式学习,简单工厂模式、工厂方法模式、抽象工厂模式,工厂模式在spring框架中的应用,spring框架中的BeanFactory和FactoryBean

github_38727595的博客 1838

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HeadFirst 设计模式学习笔记4--工厂模式

本文已搬家至【HeadFirst 设计模式学习笔记】4 工厂模式

gnuhpc的专栏 3620

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式

设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式

qq_44597856的博客 115

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

学习设计模式《一》——简单工厂

简单工厂方法的内部主要实现的功能是【选择合适的实现类】来创建实例对象

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 967

设计模式1:简单工厂模式学习

算起来,俺从开始学c++到现在,也有大概7年了,即从大一就开始学习c++语言程序设计了。虽然对编程很感兴趣,但由于不是科班(生物医学工程专业),所以锻炼的机会自然较少一些。这期间,零零散散做过一些课程设计:图形图像处理的等等都用到了c++语言,但大多还是依葫芦画瓢,现在回想起来,那时写的code真是惨不忍睹啊。后来读研期间,跟随导师做了两年项目,算是感觉有些入门了。但是现在回想起来,以前项目中所写...

weixin_30747253的博客 134

设计模式——个人学习之工厂模式

工厂模式简介简单工厂模式工厂方法模式抽象工厂模式 简介 我相信说到工厂模式,很多人都很熟悉,毕竟作为一个程序员怎么可能不了解Spring,用过Spring的人都知道,Sping IOC就是一个大型的工厂,它替你管理着项目中对象,你可以从IOC中随时的获取你想用到的对象,因此工厂模式简单的来说就是替我们生产对象的地方。 工厂模式有三种: 简单工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 简单工厂模式的核心就是它“很简单”,因为它只需要生产一种产品,我们可以把它想象成一个产品单一的工厂。它的UML图如

孙志南的博客 196

java设计模式学习之【工厂模式】

这篇教程不仅提供了工厂设计模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1590

java设计模式学习笔记之计算器中的简单工厂模式

java设计模式学习笔记之计算器中的简单工厂模式 最近在重温设计模式,偶然看到程杰的《大话设计模式》写的非常不错、通俗易懂,之后的一系列都是学习的笔记,仅此记录。 一、情景回放:某校大二软件工程专业班的《Java程序设计》课上,老师给大伙出了一个题目:用java实现一个简单的计算器功能(用

大力哥的博客 4795

设计模式学习之工厂设计模式

工厂设计模式

qq_43621307的博客 371

【设计模式】工厂模式学习小结

工厂模式应该是最简单常见的设计模式之一。一般类在实体化一个对象的时候,常见是用new 关键词,Car car = new AudiCar();其中Car 是抽象接口,AudiCar是子类。但这种代码风格一定程度上违反了开闭原则。如果我们不想要把实体类暴露给客户端,即不想让用户知道AudiCar 这个实体类存在,就可以考虑工厂模式。实体类的实例化是躲不掉的,只不过我们加了一层,把这个new的过程封装起来了,把工厂类暴露给客户端,这样在实例化的时候,用工厂类实例化直接返回就可以了。

m0_69818080的博客 811

c++设计模式学习之抽象工厂模式(Abstract Factory)

刚开始学些设计模式的时候看的是gof的那本设计模式《Design Patterns: Elements of Reusable Object-Oriented Software》,抽象,非常难懂,建议初学者不要去看这本书,我是先从《大话设计模式》这本书开始学习设计模式的,虽然这本书用的是Java语言,但是面向对象语言的基本思维方式都是一样的,其实设计模式就是教我们面向对象语言中一些常用的编程思维。

liuyanan66的专栏 289

【设计模式学习】简单工厂模式

C++学习简单工厂模式首先,明确一点,简单工厂模式属于创建型模式,但不属于GoF的23种模式;简单工厂模式的定义: 根据传入的参数即可返回需要的对象,而不需要知道具体的类名;简单说明:就是根据传入的参数返回可能的类的具体实例,通常工厂返回的类都具有一个公共的方法和父类;而工厂是什么?就是产生实例类的工厂类,将对象的创建和使用分离开来;简单举例:如果你想吃水果,比如香蕉,现在有两种获取的方法,一种是自

John的博客 1320

设计模式学习——工厂模式

工厂设计模式简单工厂模式基本介绍工厂方法模式基本介绍 简单工厂模式 基本介绍 简单工厂模式属于创建型模式,是工厂模式的一种,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码) 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。 简单工厂模式类图实例: 简单工厂模式java实现代码: //Pizza抽象类 public abstract cl

JavaKobeBryant的技术交流 398
下一篇: 大话设计模式阅读笔记(1)之工厂模式心得
程序员楂楂
博客等级 码龄9年 17粉丝 70原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值