简述设计模式-工厂模式

概述

工厂模式是为了提供创建对象的方式,无需制定要创建的具体类。

举个例子,假如我是甲方需要制造一辆车,我可以要油车,可以要电车,也可以油电混动车,如果没有工厂,我需要自己找到对应的制造车的方法来制造。

但是有了工厂之后,我不用直接去找对应类型的车的制造方法,我直接告诉工厂我需要什么类型的车,工厂就可以帮助我制造出我想要类型的车。

简单来说,我不用关注工厂是怎么造车的,我只管问工厂要就行了。

工厂模式又包括工厂方法模式,抽象工厂模式,抽象工厂模式实际像是工厂方法模式的PLUS版本,或者像是套娃版本?抽象工厂相当于将工厂作为一个产品,用户可以选择不同的工厂来定义产品的不同属性。

应用场景

当我们不知道选择哪个接口来创建实例,或者需要在不同条件下创建不同实例时。

优点

调用者只需要知道需要创建的对象的名称即可告诉工厂类进行对象的创建。

缺点

每当增加产品,都需要新增一个工厂类和具体实现类,过多造成类爆炸,系统复杂度就高了。

应用实例

类图

代码

1. 制造汽车接口

public interface Car {//创造汽车的抽象方法void create();
}

2. 汽车具体实现类,包括油车,电车,混动

public class OilCar implements Car {@Overridepublic void create() {System.out.println("制造油车");}
}
public class ElecCar implements Car {@Overridepublic void create() {System.out.println("制造电车");}
}
public class MixCar implements Car {@Overridepublic void create() {System.out.println("制造油电混动车");}
}

3. 工厂类

public class CarFactory {//通过判断传入的参数来决定生产什么类型的汽车public Car createCar(String type){if("油车".equals(type)){return new OilCar();}if("电车".equals(type)){return new ElecCar();}if("混动车".equals(type)){return new MixCar();}return null;}
}

 4. 调用方法

public class main {public static void main(String[] args) {//创建工厂对象CarFactory carFactory = new CarFactory();//创建汽车对象Car car1 = carFactory.createCar("油车");Car car2 = carFactory.createCar("电车");Car car3 = carFactory.createCar("混动车");//创建汽车car1.create();car2.create();car3.create();}
}

抽象工厂方法

E-R图 

代码

1. 抽象工厂类

public abstract class AbstractFactory {public abstract Car createCar(String Car);public abstract Color createColor( String Color);
}

2. 工厂实现类

public class CarFactory extends AbstractFactory {//通过判断传入的参数来决定生产什么类型的汽车public Car createCar(String type){if("油车".equals(type)){return new OilCar();}if("电车".equals(type)){return new ElecCar();}if("混动车".equals(type)){return new MixCar();}return null;}@Overridepublic Color createColor(String Color) {return null;}
}
public class ColorFactory extends AbstractFactory {@Overridepublic Car createCar(String Car) {return null;}//通过判断传入的参数来决定生产什么类型的汽车public Color createColor(String type){if("红色".equals(type)){return new Red();}if("黄色".equals(type)){return new Yellow();}if("蓝色".equals(type)){return new Blue();}return null;}
}

3. 产品抽象类和实现类

//汽车接口类
public interface Car {//创造汽车的抽象方法void createCar();
}//汽车实现类
public class OilCar implements Car {@Overridepublic void createCar() {System.out.println("制造油车");}
}
public class ElecCar implements Car {@Overridepublic void createCar() {System.out.println("制造电车");}
}
public class MixCar implements Car {@Overridepublic void createCar() {System.out.println("制造油电混动车");}
}
//颜色接口类
public interface Color {void createColor();
}
public class Red implements Color{@Overridepublic void createColor() {System.out.println("红色");}
}
public class Yellow implements Color{@Overridepublic void createColor() {System.out.println("黄色");}
}
public class Blue implements Color{@Overridepublic void createColor() {System.out.println("蓝色");}
}

 4. 选择工厂对应的工厂

public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase("汽车")){return new CarFactory();} else if(choice.equalsIgnoreCase("颜色")){return new ColorFactory();}return null;}
}

5. 主类调用

public class main {public static void main(String[] args) {//创建汽车工厂AbstractFactory carFactory = FactoryProducer.getFactory("汽车");Car oilCar = null;if (carFactory != null) {oilCar = carFactory.createCar("油车");}if (oilCar != null) {oilCar.createCar();}//创建颜色工厂AbstractFactory colorFactory = FactoryProducer.getFactory("颜色");Color redColor = null;if (colorFactory != null) {redColor = colorFactory.createColor("红色");}if (redColor != null) {redColor.createColor();}}
}

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

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

相关文章

可重入锁思想,设计MQ迁移方案

如果你的MQ消息要从Kafka切换到RocketMQ且不停机,怎么做?在让这个MQ消息调用第三方发奖接口,但无幂等字段又怎么处理?今天小傅哥就给大家分享一个关于MQ消息在这样的场景中的处理手段。 这是一种比较特例的场景,需要保…

数据质量管理-可访问性管理

前情提要 根据GB/T 36344-2018《信息技术 数据质量评价指标》的标准文档,当前数据质量评价指标框架中包含6评价指标,在实际的数据治理过程中,存在一个关联性指标。7个指标中存在4个定性指标,3个定量指标; 定性指标&am…

kaggle量化赛金牌方案(第七名解决方案)

获奖文章(第七名解决方案) 致谢 我要感谢 Optiver 和 Kaggle 组织了这次比赛。这个挑战提出了一个在金融市场时间序列预测领域中具有重大和复杂性的问题。 方法论 我的方法结合了 LightGBM 和神经网络模型,对神经网络进行了最少的特征工程。目标是结合这些模型以降低最终…

WebDriver API (2)

本文将继续上文对WebDriver API的功能使用进行介绍。 一、浏览器操作 1. 浏览器前进forward与后退back 浏览器前进操作是指导航到前一个页面,在浏览器的历史记录中向前移动一页。 浏览器后退操作是指导航到前一个页面,在浏览器的历史记录中向后移动一…

JVM专题之走进类加载

1.1 Java及JVM简介 TIOBE语言热度排行榜:https://www.tiobe.com/tiobe-index/ 世界上没有最好的编程语言,如果有,我相信一定是JAVA。 1.2 Java发展的重大事件 1995年5月23日,Java语言诞生 1996年1月,第一个JDK-JDK1.0诞生 1996…

C语言编程-基于单链表实现贪吃蛇游戏

基于单链表实现贪吃蛇游戏 1.定义结构体参数 蛇行走的方向 蛇行走的状态 蛇身节点类 维护蛇的结构体型 2.游戏运行前预备工作 定位光标位置 游戏欢迎界面 绘制游戏地图(边界) 初始化游戏中的蛇身 创建食物 3.游戏运行 下一个位置是食物,就吃掉…

ArcGIS中将测绘数据投影坐标(平面坐标)转地理坐标(球面经纬度坐标)

目录 前言1.测绘数据预览1.1 确定带号1.2 为什么是对Y轴分带,而不是对X轴分带? 2 测绘数据转shp2.1 添加数据2.2 显示XY数据2.3 添加经纬度字段2.4 计算经纬度 3.shp数据重投影4.总结 前言 最近在刚好在做一个小功能,将测绘数据转为经纬度坐标…

浙江建筑安全员A证2024年最新考试题库练习

46.总承包单位依法将建设工程分包给其他单位的,分包合同中应当明确各自的安全生产方面的权利、义务。总承包单位对分包工程的安全生产承担()责任。 A.全部 B.主要 C.部分 D.连带 答案:D 47.实施总承报的建设工程发生事故&…

Git命令远程分支的合并和本地分支的同步

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

怎么压缩ppt文件大小?这四种压缩方法真的超级好用!

怎么压缩ppt文件大小?当我们精心打造PPT时,随着创意的涌动和内容的充实,常常会发现PPT文件的大小也在不知不觉间悄然膨胀,这背后其实隐藏着诸多因素,首先,我们可能过于追求视觉效果,不经意间在P…

【信息学奥赛】CSP-J/S初赛05 计算机原码、补码和反码

本专栏👉CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容,包含计算机基础、初赛常考的C程序和算法以及数据结构,并收集了近年真题以作参考。 如果你想参加信息学奥赛,但之前没有太多C基础,请点击👉专栏&#…

IPython交互式Shell的高级功能:探索Python交互式编程的边界

🚀 IPython交互式Shell的高级功能:探索Python交互式编程的边界 IPython是一个强大的Python交互式解释器,它提供了许多高级功能,使得Python编程更加高效和有趣。这些功能包括但不限于改进的交互式Shell、Jupyter笔记本、魔术命令、…

线性代数大题细节。

4.4 方程组解的结构(二)_哔哩哔哩_bilibili

c++将一个复杂的结构体_保存成二进制文件并读取

在 C 中&#xff0c;可以将复杂的结构体保存到二进制文件中&#xff0c;并从二进制文件中读取它。为了实现这一点&#xff0c;你可以使用文件流库 <fstream>。以下是一个示例&#xff0c;展示如何将一个复杂的结构体保存到二进制文件中&#xff0c;并从二进制文件中读取它…

【高中数学/三角函数】已知:实数a,b,c满足a+b+c=0,且a^2+b^2+c^2=1 求:a的最大值?

【问题】 已知&#xff1a;实数a,b,c满足abc0,且a^2b^2c^21 求&#xff1a;a的最大值&#xff1f; 【问题来源】 https://www.ixigua.com/7289764285772497448?logTag0d228277f3a8e049ab6d 【解答】 解&#xff1a;由abc0可得c-(ab) 代入a^2b^2c^21得a^2b^2(ab)^21 又…

深入MOJO编程语言的单元测试世界

引言 在软件开发的历程中&#xff0c;单元测试扮演着至关重要的角色。单元测试不仅帮助开发者确保代码的每个部分都按预期工作&#xff0c;而且也是代码质量和维护性的关键保障。本文将引导读者了解如何在MOJO这一假想编程语言中编写单元测试&#xff0c;尽管MOJO并非真实存在…

Docker在windows上使用vscode远程连接容器

目录 一、提前准备&#xff1a; 二、vscode连接docker容器 三、构建好的docker容器直接连接vscode 四、Windows下的可视化出linux的ui界面 在日常的开发中&#xff0c;不想windows和linux两个系统之间来回切换&#xff0c;笔者最近打算所有的环境均在一个系统上完成。为了交…

Nosql期末复习

mongodb基本常用命令&#xff08;只要掌握所有实验内容就没问题&#xff09; 上机必考&#xff0c;笔试试卷可能考&#xff1a; 1.1 数据库的操作 1.1.1 选择和创建数据库 &#xff08;1&#xff09;use dbname 如果数据库不存在则自动创建&#xff0c;例如&#xff0c;以下…

学习无人机飞行技术,有哪些就业方向?

随着无人机技术的不断进步和应用领域的拓展&#xff0c;研发创新人才的需求也将不断增加&#xff0c;那就业前景还是很广阔的。学习无人机飞行技术后&#xff0c;有以下多个就业方向可供选择&#xff1a; 1. 无人机操作员&#xff1a; - 负责操控和监控无人机飞行&#xff0c;…

基于索尼基于索尼Spresense的眼睛跟随平台中两个模型的对比

1.模型一(现在使用的) 这个模型是一个简单的神经网络&#xff0c;由三个主要组件组成&#xff1a;输入层、一个全连接层&#xff08;Affine层&#xff09;、一个Sigmoid激活函数层和一个Binary Cross Entropy损失层。 以下是每个组件的说明&#xff1a; Input 层&#xff1a;这…