轻松创建对象——简单工厂模式(Java实现)

news2024/11/16 12:07:37

1. 引言

大家好,又见面了!在上一篇文章中,我们通过Python示例介绍了简单工厂模式,今天,我们继续深入这个话题,用Java来实现简单工厂模式。

2. 什么是简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个工厂类,根据传入的参数决定创建哪一种产品类的实例。简单来说,简单工厂模式就是把创建对象的任务交给一个专门的工厂类,让工厂来决定生产哪种对象,咱们只需安心享用即可。

3. 简单工厂模式的实现(Java)

示例一:形状工厂

假如你是个艺术家,需要画各种形状,圆形、方形啥的,你可以用简单工厂模式让工厂帮你搞定这些形状对象:

代码实现
// 定义Shape接口
public interface Shape {
    void draw();
}

// 实现Circle类
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

// 实现Square类
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Square");
    }
}

// 实现ShapeFactory工厂类
public class ShapeFactory {
    public static Shape createShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

// 使用示例
public class FactoryPatternDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        // 获取 Circle 对象并调用其 draw 方法
        Shape shape1 = shapeFactory.createShape("CIRCLE");
        shape1.draw();  // 输出: Drawing a Circle

        // 获取 Square 对象并调用其 draw 方法
        Shape shape2 = shapeFactory.createShape("SQUARE");
        shape2.draw();  // 输出: Drawing a Square
    }
}
详细代码解析
  • Shape是一个接口,定义了draw方法;
  • CircleSquare类实现了Shape接口,具体画啥样子它们说了算;
  • ShapeFactory类有一个静态方法createShape,根据传入的形状类型参数创建并返回对应的形状对象;
  • 我们只需通过调用ShapeFactory.createShape方法并传入形状类型,就能轻松得到相应的形状对象。
示例二:日志记录器工厂

现在你是个开发者,搞个日志系统,你想要不同级别的日志记录器来帮你分门别类记录信息,简单工厂模式也能派上用场:

代码实现
// 定义Logger接口
public interface Logger {
    void log(String message);
}

// 实现InfoLogger类
public class InfoLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("INFO: " + message);
    }
}

// 实现ErrorLogger类
public class ErrorLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("ERROR: " + message);
    }
}

// 实现LoggerFactory工厂类
public class LoggerFactory {
    public static Logger createLogger(String loggerType) {
        if (loggerType == null) {
            return null;
        }
        if (loggerType.equalsIgnoreCase("INFO")) {
            return new InfoLogger();
        } else if (loggerType.equalsIgnoreCase("ERROR")) {
            return new ErrorLogger();
        }
        return null;
    }
}

// 使用示例
public class FactoryPatternDemo {
    public static void main(String[] args) {
        LoggerFactory loggerFactory = new LoggerFactory();

        // 获取 InfoLogger 对象并调用其 log 方法
        Logger infoLogger = loggerFactory.createLogger("INFO");
        infoLogger.log("This is an informational message.");  // 输出: INFO: This is an informational message.

        // 获取 ErrorLogger 对象并调用其 log 方法
        Logger errorLogger = loggerFactory.createLogger("ERROR");
        errorLogger.log("This is an error message.");  // 输出: ERROR: This is an error message.
    }
}
详细代码解析
  • Logger是一个接口,定义了log方法;
  • InfoLoggerErrorLogger类实现了Logger接口,分别负责记录不同级别的日志;
  • LoggerFactory类的静态方法createLogger根据传入的日志类型参数创建并返回对应的日志记录器对象;
  • 你只需通过调用LoggerFactory.createLogger方法并传入日志类型参数,就能得到相应的日志记录器对象。

4. 简单工厂模式的应用场景和实例

示例三:数据库连接工厂

假如你现在是个DBA,需要管理多个数据库连接,简单工厂模式同样能帮你搞定这个问题:

代码实现
// 定义DatabaseConnection接口
public interface DatabaseConnection {
    void connect();
}

// 实现MySQLConnection类
public class MySQLConnection implements DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("Connecting to MySQL database...");
    }
}

// 实现PostgreSQLConnection类
public class PostgreSQLConnection implements DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("Connecting to PostgreSQL database...");
    }
}

// 实现DatabaseConnectionFactory工厂类
public class DatabaseConnectionFactory {
    public static DatabaseConnection createConnection(String dbType) {
        if (dbType == null) {
            return null;
        }
        if (dbType.equalsIgnoreCase("MYSQL")) {
            return new MySQLConnection();
        } else if (dbType.equalsIgnoreCase("POSTGRESQL")) {
            return new PostgreSQLConnection();
        }
        return null;
    }
}

// 使用示例
public class FactoryPatternDemo {
    public static void main(String[] args) {
        DatabaseConnectionFactory dbFactory = new DatabaseConnectionFactory();

        // 获取 MySQLConnection 对象并调用其 connect 方法
        DatabaseConnection mysqlConnection = dbFactory.createConnection("MYSQL");
        mysqlConnection.connect();  // 输出: Connecting to MySQL database...

        // 获取 PostgreSQLConnection 对象并调用其 connect 方法
        DatabaseConnection postgresqlConnection = dbFactory.createConnection("POSTGRESQL");
        postgresqlConnection.connect();  // 输出: Connecting to PostgreSQL database...
    }
}
详细代码解析
  • DatabaseConnection是一个接口,定义了connect方法;
  • MySQLConnectionPostgreSQLConnection类实现了DatabaseConnection接口,分别负责不同数据库的连接;
  • DatabaseConnectionFactory类的静态方法createConnection根据传入的数据库类型参数创建并返回对应的数据库连接对象;
  • 你只需通过调用DatabaseConnectionFactory.createConnection方法并传入数据库类型参数,就能得到相应的数据库连接对象。

5. 简单工厂模式的优缺点

优点
  • 解耦:把对象的创建过程封装在工厂类里,客户端代码只需关心怎么用,不用关心怎么创建;
  • 灵活性:通过工厂类可以灵活地创建不同类型的对象,扩展性杠杠的。
缺点
  • 违背开闭原则:每次新增对象类型,都得改工厂类,比较麻烦;
  • 单一职责问题:工厂类负责创建所有对象,复杂项目里可能会比较臃肿。

6.示意图(图片来源:https://xie.infoq.cn/article/270b6bbfd752d9906bf0a09df)

img

7. 总结

简单工厂模式就是这么神奇,它让对象的创建变得简单又高效,适用于各种需要灵活创建对象的场景。虽然它有一些缺点,但在大多数情况下,简单工厂模式依然是个非常实用的设计模式。希望今天的分享能让大家对简单工厂模式有更深入的理解,如果你在项目中也用到了简单工厂模式,欢迎留言分享你的经验和见解!
在这里插入图片描述

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

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

相关文章

CorelDRAW2024设计师的神器,一试就爱上!

🎨 CorelDRAW 2024:设计界的瑞士军刀,让创意不再受限!🌟 嗨,各位朋友们!👋🏻 今天我要跟大家分享一个神奇的设计神器——CorelDRAW 2024。作为设计师的你,是否…

谷粒商城----通过缓存和分布式锁获取数据。

高并发下缓存失效的问题 高并发下缓存失效的问题--缓存穿透 指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的不写入缓存,这将导致这个不存在的数据每次请求…

【论文阅读】-- Interactive Horizon Graphs:改进多个时间序列的紧凑可视化

Interactive Horizon Graphs: Improving the Compact Visualization of Multiple Time Series 摘要1 引言2 相关工作2.1 多个时间序列的可视化2.2 缩减折线图 (RLC)2.3 地平线图 (HG)2.4 大尺度和小尺度变异数据集2.5 多个时间序列…

IPSS模块怎么安装到VOS服务器的,到底有没有效果,是不是能大幅度提升VOS3000安全性呢

由于VOS的普及性,不得不承认VOS确实是非常优秀的软交换,但是很多客户在使用过程中都会遇到各种安全问题,比如话费被盗用了,历史话单一堆的非法呼叫话单,严重的影响到了话务安全,并不是那点话费的事了&#…

浏览器怎么抓包?Wireshark详细教程奉上!

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

校园气象站:科学教育与环境感知

在现代化的校园里,一座座高耸的教学楼、郁郁葱葱的绿植、充满活力的学生群体共同构成了一幅生机勃勃的画卷。然而,在这幅画卷中,有一个不可或缺的元素——校园气象站,它不仅是学生们学习气象知识的窗口,更是连接科学与…

【技术支持】vscode代码格式化空格数量问题

问题 使用AltShiftF代码格式化时,发现有些文件格式化后缩进为2格个空格,有些文件正常4个空格 刨析 发现vue创建的文件使用的是两个空格,而且换行符表示方式也不一样 LF 是 Unix 和 Unix-like 系统(如 Linux 和 macOS&#xff0…

边缘概率密度、条件概率密度、边缘分布函数、联合分布函数关系

目录 二维随机变量及其分布离散型随机变量连续型随机变量边缘分布边缘概率密度举例边缘概率密度 条件概率密度边缘概率密度与条件概率密度的区别边缘概率密度条件概率密度举个具体例子 参考资料 二维随机变量及其分布 离散型随机变量 把所有的概率,都理解成不同质量…

最新CorelDRAW2024设计师的必备神器!

Hey,各位创意小能手和设计爱好者们,今天要跟大家安利一个超级给力的设计软件——CorelDRAW 2024!如果你还在用那些老旧的设计工具,那你就OUT啦!🎉🎨 CorelDRAW全系列汉化版下载网盘分享链接&am…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第55课-芝麻开门(语音 识别 控制3D纪念馆开门 和 关门)

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第55课-芝麻开门(语音识别控制3D纪念馆开门和关门) 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtn…

Vue 3 中集成 ECharts(附一些案例)

Vue 3 中集成 ECharts 的完全指南 引言 在现代Web开发中,Vue 3以其卓越的性能和灵活的Composition API赢得了广泛的关注。而ECharts,作为开源的一个使用JavaScript实现的强大可视化库,以其丰富的图表类型和高度可定制性成为了数据可视化的首…

基于Qwen2/Lllama3等大模型,部署团队私有化RAG知识库系统的详细教程(Docker+AnythingLLM)

自 ChatGPT 发布以来,大型语言模型(Large Language Model,LLM,大模型)得到了飞速发展,它在处理复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹,几乎各行各业均可从中获益。 然…

Vatee万腾平台:智慧生活的无限可能

在科技日新月异的今天,我们的生活正被各种智能技术悄然改变。从智能家居到智慧城市,从个人健康管理到企业数字化转型,科技的力量正以前所未有的速度渗透到我们生活的每一个角落。而在这场智能革命的浪潮中,Vatee万腾平台以其卓越的…

ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法

目录 方法1&#xff1a;php://filter 流的 base64-decode 方法 方法2&#xff1a;通过 rot13 编码实现绕过 方法3&#xff1a;通过 strip_tags 函数去除 XML 标签 除了替换&#xff0c;新增 file_put_contents 函数&#xff0c;将会往 $file 里写入 <?php die(大佬别秀了…

Drools开源业务规则引擎(三)- 事件模型(Event Model)

文章目录 Drools开源业务规则引擎&#xff08;三&#xff09;- 事件模型&#xff08;Event Model&#xff09;1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类My…

leetcode力扣_双指针问题

141. 环形链表 思路&#xff1a;判断链表中是否有环是经典的算法问题之一。常见的解决方案有多种&#xff0c;其中最经典、有效的一种方法是使用 快慢指针&#xff08;Floyd’s Cycle-Finding Algorithm&#xff09;。 初始化两个指针&#xff1a;一个快指针&#xff08;fast&…

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

个人和企业都有隐私保护的需求&#xff0c;文件加密可以确保敏感信息不被未授权的人查看。在数据传输或存储过程中&#xff0c;加密可以防止数据被截获或非法访问。企业需要保护其商业机密&#xff0c;如专利、商业策略和客户信息等&#xff0c;防止竞争对手获取。加密可以保护…

腐蚀服务器如何设置管理员

可以设置服主与管理员 控制台中设置&#xff08;需游戏账号在线&#xff09; 服主 添加&#xff1a;在控制台中输入ownerid空格SteamID 删除&#xff1a;在控制台中输入removeowner空格SteamID 管理员 添加&#xff1a;在控制台中输入moderatorid空格SteamID 删除&#…

分布式事务get global lock fail Xid 获取全局锁失败

问题如下&#xff1a; 解决方法&#xff1a;在发生报错的方法上添加本地事务

C#中委托与事件

一、委托 1.1概念 委托是一种引用类型&#xff0c;它可以用于封装并传递方法作为参数。委托可以理解为是一个指向方法的**“指针”&#xff0c;它允许将方法作为参数传递给其他方法或存储在数据结构中&#xff0c;然后稍后调用这些方法。&#xff08;委托可以看作时函数的容器…