详解23种设计模式——工厂模式

news2024/12/26 12:35:31

工厂模式 | CoderMast编程桅杆工厂模式 设计思想 工厂模式是最常用的设计模式之一,属于创建型模式,将创建对象的权利交给了一个工厂类,从而提供了一种不使用构造方法的情况下创建对象的途径,无需指定要创建的具体类,将创建对象的过程进行封装,通过提供的通用接口和一组实现类,隐藏了具体的对象实例化细节,使得实际对象创建的逻辑与使用该对象的逻辑分离,降低了程序的耦合度,实现解耦。 注意 需要注...icon-default.png?t=N7T8https://www.codermast.com/dev-idea/design-patterns/create-patterns/factory-pattern.html#

设计思想

工厂模式是最常用的设计模式之一,属于创建型模式,将创建对象的权利交给了一个工厂类,从而提供了一种不使用构造方法的情况下创建对象的途径,无需指定要创建的具体类,将创建对象的过程进行封装,通过提供的通用接口和一组实现类,隐藏了具体的对象实例化细节,使得实际对象创建的逻辑与使用该对象的逻辑分离,降低了程序的耦合度,实现解耦。

注意

需要注意的是,这里说的不使用构造方法创建对象是在业务逻辑中通过调用工厂方法来获取对象的,并不是说在工厂方法的具体实现中不使用构造方法。

使用场景

  1. 对象的创建过程复杂

如果一个对象的创建过程较为复杂,或者初始化所依赖的其他项过多,且使用较为频繁,那么就可以使用工厂模式将该对象的实例化过程进行封装,既降低了程序耦合度,也让业务逻辑更为清晰和明了。

  1. 对象的创建过程不确定

如果一个对象的创建过程不确定,在后续可能会进行修改,那么此时就可以将对象的创建过程抽离出来,从而达到修改对象的创建不会影响业务逻辑的正常执行的效果。

  1. 对象的创建需要统一管理

如果需要统一管理对象的创建过程,或者需要对创建出来的对象做统一处理,那么使用工厂模式就能够很好的完成这个需求。

  1. 对象的创建依赖不同的条件

如果需要根据不同的条件来创建不同类型的对象,那么使用工厂模式可以很方便地实现这个需求。

提示

一个工厂类中可以有多个工厂方法,一般情况下工厂类中的工厂方法都是静态的,即使用 static 关键字修饰,一般都通过类来调用,不实质化工厂对象。

实现案例

  • 简单案例

// 形状接口
interface  Shape{
    void draw();
}

// 圆
class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("画一个圆...");
    }
}

// 矩形
class Rectangle implements Shape{
    @Override
    public void draw() {
        System.out.println("画一个矩形...");
    }
}

// 三角形
class Triangle implements Shape{
    @Override
    public void draw() {
        System.out.println("画一个三角形...");
    }
}

public class ShapeFactory {
    // 1. 简单工厂模式
    public static Circle getCircle(){
        return new Circle();
    }

    // 2. 复杂工厂:根据名称获取
    public static Shape getShape(String type){
        if (type == null || type.equals("")){
            return null;
        }

        if (type.equalsIgnoreCase("circle")){
            return new Circle();
        }else if (type.equalsIgnoreCase("rectangle")){
            return new Rectangle();
        }

        return null;
    }
}
  • 测试类

// 工厂模式
public class FactoryPattern {
    public static void main(String[] args) {
        ShapeFactory.getShape("Circle").draw();
        ShapeFactory.getShape("Rectangle").draw();
    }
}
  • 测试结果

画一个圆...
画一个矩形...

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

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

相关文章

【可下载】CDA 1级教材《精益业务数据分析》2023最新版

CDA一级认证教材:《精益业务数据分析》 全面、系统地讲述业务描述性分析为企业决策行为创造价值的全流程技能,涵盖描述性数据分析方法、业务分析方法、数据分析结果应用方法等内容。 条理清晰的结构、通俗易懂的语言、完整立体的知识框架为读者铺开一幅…

word添加行号

打开页面设置,找到行号

制造型企业 如何实现便捷的机台文件统一管理?

机台文件统一管理,这是生产制造型企业都需要去做的,机台文件需要统一管理的原因主要包括以下几点: 1、提高效率:统一管理可以简化文件的访问和使用过程,提高工作效率,尤其是在需要频繁访问或更新机台文件的…

数据库MySQL的初级基础操作

文章目录 1. 介绍2. 数据库相关概念3. 启动4. 数据模型5. SQL6. DDL数据库DDL-表操作DDL-表操作-数据类型DDL-表操作-修改DDL-表操作-删除 7. 图形化界面工具DataGrip8. DML(数据操作语言)DML-添加数据DML-修改数据 9. DQL(数据查询语言)基本查询条件查询…

如何把经验变成可以销售的“知识产品”?

知识付费,很多人想做,但是不知道如何把自己在某方面的“经验”,变成一个“知识产品”,那么这篇文章,我们就来聊聊如何从0打造一个知识产品 非常简单,一共六个步骤: 第一步:取名字&…

【安卓13-Framework】SystemUI定制之屏蔽下拉状态栏部分快捷按钮

1、需求 屏蔽下拉状态栏谷歌录屏、省电模式、二维码扫描器等快捷按钮。 2、修改路径 普及:安卓的SystemUI包提供了状态栏、导航栏、通知中心等重要的用户界面元素。 状态栏小部件UI显示修改路径:frameworks/base/packages/SystemUI/src/com/android/s…

政安晨:【Keras机器学习示例演绎】(十七)—— 用于图像分类的 RandAugment 可提高鲁棒性

目录 导入与设置 加载 CIFAR10 数据集 定义超参数 初始化 RandAugment 对象 创建 TensorFlow 数据集对象 可视化使用 RandAugment 增强的数据集 可视化使用 simple_aug 增强的数据集 定义模型构建实用功能 使用 RandAugment 训练模型 用 simple_aug 训练模型 加载 C…

Rime 如何通过 iCloud 实现词库多端同步,Windows、iOS、macOS

Rime 如何通过 iCloud 实现词库多端同步,Windows、iOS、macOS 一、设备环境 最理想的输入环境就是在多端都使用同一个词库,这样能保持多端的输入习惯是一致的。 以我为例,手头每天都要用到的操作平台和对应的输入法: 操作系统设…

Spring Boot | Spring Boot “自定义“ Redis缓存 “序列化机制“

目录: Spring Boot "自定义" Redis缓存 "序列化机制" :一、基于 "注解" 的 "Redis缓存管理" 的 "默认序列化机制" 和 "自定义序列化机制"1.1 基于 "注解" 的 "Redis缓存管理" 的 …

抽象代理模式2.0版本

前言: 1.0版本的核心 代理的定义 A proxy, in its most general form, is a class functioning as an interface to something else. The proxy could interface to anything: a network connection, a large object in memory, a file, or some other resource t…

金融级国产化替代中间件有哪些?

过去,国内中间件市场一直由IBM、Oracle等国际大型企业所主导,这在一定程度上限制了对国内企业多样化和个性化需求的满足,尤其是在实现底层硬件与上层应用软件之间高效、精准匹配方面。面对日益复杂的国际局势,金融安全已成为国家整…

akSmart大带宽服务器基础配置科普

在数字化时代,服务器的性能和网络带宽成为业务发展的关键因素。RakSmart作为知名的服务器提供商,其大带宽服务器备受用户青睐。那么,RakSmart大带宽服务器的基础配置究竟有哪些呢?本文将为您揭开这一神秘面纱。 首先,我们来看看R…

【基于YOLOv8的教室人脸识别 附源码 数据集】

基于YOLOv8的教室人脸识别 附源码 数据集 在当今数字化迅速发展的教育领域中,人脸识别技术已成为提高校园安全和教学效率的关键工具。本文将详细介绍基于最新YOLOv8算法的教室人脸识别系统,这一系统不仅能够实时准确地识别学生和教职工的面部特征&#…

【QT】ROS2 Humble联合使用QT教程

【QT】ROS2 Humble联合使用QT教程 文章目录 【QT】ROS2 Humble联合使用QT教程1. 安装ROSProjectManager插件2. 创建ROS项目3.一个快速体验的demoReference 环境的具体信息如下: ubunt 22.04ros2 humbleQt Creator 13.0.0ROS ProjectManager 13.0.0 本文建立在已经…

【A-034】基于SSH的电影订票系统(含论文)

【A-034】基于SSH的电影订票系统(含论文) 开发环境: Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库: MySQL 技术: SpringStruts2HiberanteJSPJquery 适用于: 课程设计,毕业设计&…

MacOS通过命令行开启关闭向日葵远程控制的后台服务

categories: [Tips] tags: MacOS Tips 写在前面 经常有小伙伴问我电脑相关的问题, 而解决问题的一个重要途径就是远程了. 关于免费的远程工具我试过向日葵和 todesk, 并且主要使用向日葵, 虽然 MacOS 下要设置很多权限, 但是也不影响其丝滑的控制. 虽然用着舒服, 但是向日葵…

【Elasticsearch<一>✈️✈️】简单安装使用以及各种踩坑

目录 🍸前言 🍻一、软件安装(Windows版) 1.1、Elasticsearch 下载 2.1 安装浏览器插件 3.1、安装可视化工具 Kibana 4.1、集成 IK 分词器 🍺二、安装问题 🍹三、测试 IK 分词器 ​🍷 四、章…

高端制造企业生产设备文件管理,怎样保证好用不丢失文件?

高端制造业在市场经济中占据重要角色,在高端制造业企业内部,生产设备又是最关键的一环环,它们不仅负责完成生产任务,同时也会产生大量的文件。这些数据反映了设备的运行状态、生产效率、能源消耗以及产品质量等多个方面&#xff0…

Delta模拟器:iOS上的复古游戏天堂

Delta模拟器:iOS上的复古游戏天堂 在数字时代,我们有时会怀念起那些早期的电子游戏,它们简单、纯粹,带给我们无尽的乐趣。虽然现在的游戏在画质和玩法上都有了巨大的提升,但那种复古的感觉却始终无法替代。幸运的是&a…

科技云报道:走入商业化拐点,大模型“开箱即用”或突破行业困局

科技云报道原创。 大模型加速狂飙,AI商业化却陷入重重困境。 一方面,传统企业不知道怎么将AI融入原始业务,另一方面,AI企业难以找到合适的商业化路径。 纵观海外AI玩家,已经有许多企业趟出了自己的商业化道路。 微…