Java中的设计模式:工厂模式

Java中的设计模式:工厂模式

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

1. 什么是工厂模式?

工厂模式是一种创建型设计模式,用于创建对象的过程被推迟到子类。它提供了一种创建对象的最佳方式,而无需明确指定它们的具体类。工厂模式在面向对象编程中被广泛应用,有助于代码的灵活性和可维护性。

2. 简单工厂模式

简单工厂模式是工厂模式的最简单形式,它通过一个共同的接口或父类来创建对象,但客户端不需要知道具体实现类。以下是一个简单工厂模式的示例:

package cn.juwatech.factory;// 接口
public interface Shape {void draw();
}// 实现类1
package cn.juwatech.factory;public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}// 实现类2
package cn.juwatech.factory;public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}// 简单工厂类
package cn.juwatech.factory;public class ShapeFactory {// 使用 getShape 方法获取形状类型的对象public Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();} else if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();}return null;}
}// 测试类
package cn.juwatech;import cn.juwatech.factory.Shape;
import cn.juwatech.factory.ShapeFactory;public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();// 获取 Circle 的对象,并调用它的 draw 方法Shape shape1 = shapeFactory.getShape("CIRCLE");// 调用 Circle 的 draw 方法shape1.draw();// 获取 Rectangle 的对象,并调用它的 draw 方法Shape shape2 = shapeFactory.getShape("RECTANGLE");// 调用 Rectangle 的 draw 方法shape2.draw();}
}

3. 工厂方法模式

工厂方法模式通过定义一个创建对象的接口,但是由子类决定要实例化的类是哪一个。以下是工厂方法模式的示例:

package cn.juwatech.factory;// 接口
public interface Shape {void draw();
}// 实现类1
package cn.juwatech.factory;public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}// 实现类2
package cn.juwatech.factory;public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}// 工厂接口
package cn.juwatech.factory;public interface ShapeFactory {Shape createShape();
}// 具体工厂类1
package cn.juwatech.factory;public class RectangleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}// 具体工厂类2
package cn.juwatech.factory;public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}// 测试类
package cn.juwatech;import cn.juwatech.factory.Shape;
import cn.juwatech.factory.CircleFactory;
import cn.juwatech.factory.RectangleFactory;
import cn.juwatech.factory.ShapeFactory;public class FactoryPatternDemo {public static void main(String[] args) {// 使用 CircleFactory 创建 Circle 的对象ShapeFactory circleFactory = new CircleFactory();Shape circle = circleFactory.createShape();circle.draw();// 使用 RectangleFactory 创建 Rectangle 的对象ShapeFactory rectangleFactory = new RectangleFactory();Shape rectangle = rectangleFactory.createShape();rectangle.draw();}
}

4. 抽象工厂模式

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。以下是抽象工厂模式的示例:

package cn.juwatech.factory;// 形状接口
public interface Shape {void draw();
}// 颜色接口
public interface Color {void fill();
}// 具体形状实现类1
package cn.juwatech.factory;public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}// 具体形状实现类2
package cn.juwatech.factory;public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}// 具体颜色实现类1
package cn.juwatech.factory;public class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}
}// 具体颜色实现类2
package cn.juwatech.factory;public class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}
}// 抽象工厂接口
package cn.juwatech.factory;public interface AbstractFactory {Shape createShape();Color createColor();
}// 具体工厂类1
package cn.juwatech.factory;public class ShapeFactory implements AbstractFactory {@Overridepublic Shape createShape() {return new Rectangle();}@Overridepublic Color createColor() {return new Red();}
}// 具体工厂类2
package cn.juwatech.factory;public class ColorFactory implements AbstractFactory {@Overridepublic Shape createShape() {return new Circle();}@Overridepublic Color createColor() {return new Blue();}
}// 测试类
package cn.juwatech;import cn.juwatech.factory.AbstractFactory;
import cn.juwatech.factory.Shape;
import cn.juwatech.factory.Color;
import cn.juwatech.factory.ShapeFactory;
import cn.juwatech.factory.ColorFactory;public class AbstractFactoryPatternDemo {public static void main(String[] args) {// 获取形状工厂AbstractFactory shapeFactory = new ShapeFactory();// 获取形状为 Rectangle 的对象Shape shape1 = shapeFactory.createShape();// 调用 Rectangle 的 draw 方法shape1.draw();// 获取颜色工厂AbstractFactory colorFactory = new ColorFactory();// 获取颜色为 Blue 的对象Color color1 = colorFactory.createColor();// 调用 Blue 的 fill 方法color1.fill();}
}

总结

本文介绍了工厂模式及其在Java中的三种主要形式:简单工厂模式、工厂方法模式和抽象工厂模式。每种模式都有其独特的应用场景和实现方式,可以帮助开发人员更好地管理对象的创建过程,提高代码的可扩展性和可维护性。

微赚淘客系统3.0小编出品,必属精品,转载请注明出处!

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

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

相关文章

HCIP课堂笔记

第一章 1、数据转换---目标:抽象语言---二进制---电信号 2、应用程序---接收参数和指令(编码:接收传递给计算机指令参数最终转换为二进制) 3、二进制---电信号 4、对于整个互联网而言指定了统一的标准——OSI/RM参考模型 &…

GitLab和Git

GitLab保姆级教程 文章目录 GitLab保姆级教程一、GitLab安装二、添加组和用户三、新增项目四、Git上传项目说明五、命令行指引 根据以下说明从计算机中上传现有文件:六、创建与合并分支七、GitLab回滚到特定版本八、数据备份与恢复九、docker中创建gitlab GIT 常用命…

“金山-讯飞”杯2024年武汉理工大学程序设计竞赛 A. Mobiusp败走***(思维题-点双连通分量、连通性)

题目 思路来源 官方题解 题解 手玩发现,能换的话,当且仅当.和1在一个环里,而这就是点双连通分量 所以最优策略是先把.换到(x,y)的位置,然后判断.和1在不在一个环里 也就是: 1. 判断删掉1时,.和(x,y)联…

vue 搭建 pinia

文章目录 环境设置存储读取数据【 storeToRefs】借助storeToRefs将store中的数据转为ref对象,方便在模板中使用【getters】当state中的数据,需要经过处理后再使用时,可以使用getters配置【$subscribe】通过 store 的 $subscribe() 方法侦听 s…

科研绘图系列:R语言圆形柱状图(circular barplot)

介绍 圆形柱状图(circular barplot),又称为雷达图或蜘蛛网图(Spider Chart),是一种用来展示多变量数据的图表。这种图表使用一个圆形的网格,将数据变量分布在一个或多个从中心点向外延伸的轴上,每个轴代表一个变量,数据点在轴上的位置表示该变量的值。然后,将这些点…

SAP与易链SRM系统集成案例

一、项目环境 重庆润通控股(集团)有限公司成立于2007年,是一家集合汽柴油动力及终端、摩托车、储能电源、汽车零部件、金融服务等产业的多元化集团公司。现拥有员工超4000人,业务遍布全球80多个国家及地区,2021年营…

Mysql LIKE什么时候走索引,什么时候不走索引

在 MySQL 中,LIKE 查询是否走索引,主要取决于通配符的位置和使用的存储引擎。 使用索引的情况 前缀匹配: 当 LIKE 查询中的通配符出现在字符串的末尾时,查询可以利用索引。例如,LIKE abc% 。这种情况下,索…

文件加密软件谁好用丨2024文件加密软件TOP6推荐

在数字化时代,数据安全已成为企业和个人不可忽视的重要议题。随着数据泄露事件频发,文件加密软件成为了保护敏感信息的首选工具。 本文将为您推荐2024年度最值得信赖的六大文件加密软件,帮助您选择最适合自己需求的加密工具。 1. 域智盾 软…

东方博宜1626 - 暑假的旅游计划

问题描述 期末考试结束了,小华语文、数学、英语三门功课分别考了 x、y、z 分,小华的家长说,如果小华三门功课的平均分在90 分或者 90 分以上,那么就去北京旅游,如果在 90 分以下,那么就去南京玩。 请从键盘…

[linux] git push时需要输入user 和keyword

git clone的要是ssh链接&#xff01;&#xff01;&#xff01;&#xff01; 1、用户名和邮箱 git config --global user.name "name" git config --global user.email "email" 2、生成ssh key (ED25519) ssh-keygen -t ed25519 -C "<自定义内容&g…

手机容器化 安装docker

旧手机-基于Termux容器化 1、安装app 在手机上安装Termux或ZeroTermux&#xff08;Termux扩展&#xff09; 1.1 切换源 注&#xff1a;可以将termux进行换源&#xff0c;最好采用国内源&#xff0c;例如&#xff1a;清华源等 更新包列表和升级包&#xff08;可选&#xff0…

健康云足迹:在iCloud中珍藏您的个人健康检查记录

健康云足迹&#xff1a;在iCloud中珍藏您的个人健康检查记录 随着健康意识的提高&#xff0c;个人健康数据管理变得越来越重要。iCloud作为苹果公司提供的云服务&#xff0c;不仅能够同步您的联系人、日历和照片&#xff0c;还能成为您个人健康检查记录的安全港湾。本文将详细…

数智驱动丨zAIoT 连续落地军工、科研院所和机械制造场景,推动数智化转型升级...

引言 在这个万物互联的时代&#xff0c;科技的进步正以不可阻挡之势&#xff0c;深刻地影响并重塑我们的生产和生活方式。数智化转型升级在各个领域展现出强大的动力&#xff0c;已经成为推动社会向前发展的关键力量。 最近&#xff0c;云和恩墨自主研发的数据智能分析处理平台…

FUSE(用户空间文件系统)命令参数

GPT-4 (OpenAI) FUSE (Filesystem in Userspace)是一个允许创建用户空间文件系统的接口。它提供了一个API&#xff0c;让开发者在未修改内核代码的情况下&#xff0c;通过自己的程序实现文件系统。FUSE 文件系统通常通过 mount 命令来挂载&#xff0c;而且这个命令可以接受各…

时序分解 | Matlab基于ESMD极点对称模态分解

时序分解 | Matlab基于ESMD极点对称模态分解 目录 时序分解 | Matlab基于ESMD极点对称模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ESMD&#xff08;Extreme-point Symmetric Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;用于提取信号中的模…

【C语言之高级编程】如何将指定变量或函数编译至固定的内存区域中?

如何将指定变量或函数编译至固定的内存区域&#xff1f; 1. 内存类型1.1 bss段&#xff08;Block Started by Symbol&#xff09;1.2 data段&#xff08;data segment&#xff09;1.3 text段&#xff08;code segment/text segment&#xff09;1.4 dec1.5 堆&#xff08;heap&a…

华为模拟器ensp中USG6000V防火墙web界面使用

防火墙需要配置 新建拓扑选择USG6000V型号 在防火墙中导包 忘记截图了 启动设备 输入用户名密码 默认用户名&#xff1a;admin 默认密码&#xff1a;Admin123 修改密码 然后他会提示你是否要修改密码&#xff0c;想改就改不想改就不改 进入命令行界面 进入系统视图开启web…

释放SQL Server潜能:数据库查询性能调优的黄金法则

释放SQL Server潜能&#xff1a;数据库查询性能调优的黄金法则 在企业级应用中&#xff0c;数据库查询性能是影响用户体验和系统效率的关键因素。SQL Server作为微软推出的关系型数据库管理系统&#xff0c;提供了丰富的性能调优工具和策略。本文将深入探讨SQL Server数据库查…

7个外贸网站模板

Nebula独立站wordpress主题 Nebula奈卜尤拉wordpress主题模板&#xff0c;适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 Starling师大林WordPress独立站模板 蓝色橙色风格的WordPress独立站模板&#xff0c;适合做对外贸易的外贸公司搭建…

【C++】类和对象--类,实例化,this指针

文章目录 前言一、类1.1 类的定义1.2 类的书写和使用1.3 访问限定符1.4 类域 二、实例化2.1 实例化概念2.2 对象大小 三.this指针总结 前言 前面的几篇文章我们介绍了命名空间&#xff0c;inline&#xff0c;nullptr等C 中常见的的基础概念。今天的文章我们来介绍一些C中类与对…