设计模式(二)工厂模式详解

设计模式(二)工厂模式详解

简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子:Spring 中的 BeanFactory 使用简单工厂模式,产生 Bean 对象。

工厂模式简介

  • 定义:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,不需要指定具体的类,而是通过一个专门的工厂类来创建对象。

  • 主要用途:当一个类的实例化过程较为复杂或需要根据不同的条件创建不同的对象时,可以使用工厂模式来封装对象的创建逻辑。

  • 实现了创建者和调用者的分离

  • 详细分类:

    1. 简单工厂模式

      用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有代码)

    2. 工厂方法模式

      用来生产同一个等级结构中的固定产品(支持增加任意产品)

    3. 抽象工厂模式

      围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。

核心本质:

  • 实例化对象不使用new,用工厂方法代替。

  • 将选择实现类,创作对象统一管理和控制,从而将调用者跟我们的实现类解耦

简单工厂模式:

// car接口
public interface Car {
    void name();
}
// 两辆车实现car接口
// 特斯拉
public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

// 五菱
public class WuLing implements Car{
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
// 一个汽车工厂进行造汽车
package com.briup.patterns_design.factory.simple;

/**
 * @author 35329
 *
 * 简单工厂模式 也是 静态工厂模式 (没有满足开闭原则)
 * 增加了一个新的产品,如果你不修改代码,就实现不了,做不到
 *
 * 但是大多数使用的就是简单工厂模式
 */
public class CarFactory {

    // 方法一:
    public static Car getCar(String car){
        if ("五菱".equals(car)){
            return new WuLing();
        }else if ("特斯拉".equals(car)){
            return new Tesla();
        }else {
            return null;
        }
    }

    // 方法二:
    public static Car getWuling(){
        return new WuLing();
    }
    public static Car getTesla(){
        return new Tesla();
    }
}
// 消费者类 进行买车
public class Consumer {
    public static void main(String[] args) {
        // 接口。实现所有的实现类
        Car car = new WuLing();
        Car car2 = new Tesla();

        car.name();
        car2.name();
        System.out.println("==============================");

        // 使用工厂创建
        Car car3 = CarFactory.getCar("五菱");
        Car car4 = CarFactory.getCar("特斯拉");
        car3.name();
        car4.name();
    }
}

d940ca614ce74c28bbdc95c73b04994b.png

工厂方法模式:

// 车car接口
public interface Car {
    void name();
}

// 车工厂接口
public interface CarFactory {
    Car getCar();
}
// 两辆车实现car接口 重写car中的抽象方法
public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
// 两辆车的工厂实现车工厂接口 重写造车方法
public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}
// 消费者直接从不同品牌的车工厂中,拿到车;
public class Consumer {
    public static void main(String[] args) {
        Car car = new WuLingFactory().getCar();
        Car car2 = new TeslaFactory().getCar();

        car.name();
        car2.name();
    }
    
    // 简单工厂模式和工厂方法模式比较:
    // 结构复杂度: simple
    // 代码复杂度:simple
    // 编程、管理上的复杂度:simple

    // 根据设计原则:工厂方法模式!
    // 根据实际业务:简单工厂模式!
}

b4f110e510044a21b1ee4e6622b7bbc1.png

代码结构:

41a237f81822415ca0f59db341a8980c.png

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机房巡检机器人有哪些功能和作用

随着数据量的爆炸式增长和业务的不断拓展,数据中心面临诸多挑战。一方面,设备数量庞大且复杂,数据中心内服务器、存储设备、网络设备等遍布,这些设备需时刻保持良好运行状态,因为任何一个环节出现问题都可能带来严重后…

java项目之电影评论网站(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的电影评论网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 电影评论网站的主要使用者管…

如何在 Ubuntu 24.04 上安装多PHP版本 (从8.3到5.6) ?

PHP 代表超文本预处理器,它仍然是网络的基石,为互联网上很大一部分网站和网络应用程序提供动力。大多数顶级网站和博客工具仍然使用 PHP,如 WordPress, Facebook, Wikipedia 等。如果你在 Ubuntu 24.04 上为 web 开发,安装 PHP 可…

算法的学习笔记—数组中只出现一次的数字(牛客JZ56)

😀前言 在数组中寻找只出现一次的两个数字是一道经典的问题,通常可以通过位运算来有效解决。本文将详细介绍这一问题的解法,深入解析其背后的思路。 🏠个人主页:尘觉主页 文章目录 🥰数组中只出现一次的数字…

rtsp的2种收流模式

rtsp协商成功以后就是rtp收流,又分为两种模式:rtp over rtsp(tcp)和rtp over udp。 1.rtsp over rtsp 这个现在一般都叫TCP,它的特点是rtsp服务端和客户端是共用一个tcp链接,也就是说rtsp协议报文、rtp包、rtcp数据都是通过这一个链接来交互…

合约门合同全生命周期管理系统:企业合同管理的数字化转型之道

合约门合同全生命周期管理系统:企业合同管理的数字化转型之道 1. 引言 在现代企业中,合同管理已经不再是简单的文件存储和审批流程,而是企业合规性、风险管理和业务流程的关键环节之一。随着企业规模的扩大和合同数量的增加,传统…

第二单元历年真题整理

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 参考答案 1. A 2. A 3. A 4. D 5. D 6. D 解析: 栈和队列是两个不一样的结构,不能放在一起表示 7. B 8. C 解析: S --> A0 | B1 --> (S1 | 1) 0 | (S0 | 0)1 --> S10 | 10 | S…

51单片机快速入门之 模拟 I2C 用精准中断来控制

51单片机快速入门之 模拟 I2C 用精准中断来控制 首先复习一下51单片机快速入门之定时器和计数器(含中断基础) 再看看之前的I2C操作 51单片机快速入门之 IIC I2C通信 定时器/计数器是51单片机中用于实现精确延时的硬件资源。通过配置定时器的初始值和工作模式,可以…

Unable to open nested entry ‘********.jar‘ 问题解决

今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar 为 mysql-connector-java-5.1.27.jar 启动微服务的时候就报错下面的 Exception in thread "main" java.lang.IllegalStateException: Failed to get nested ar…

《Python游戏编程入门》注-第2章2

《Python游戏编程入门》的“2.2.5 绘制线条”中提到了通过pygame库绘制线条的方法。 1 相关函数介绍 通过pygame.draw模块中的line()函数来绘制线条,该函数的格式如下所示。 line(surface, color, start_pos, end_pos, width1) -> Rect 其中,第一…

开源限流组件分析(二):uber-go/ratelimit

文章目录 本系列漏桶限流算法uber的漏桶算法使用mutex版本数据结构获取令牌松弛量 atomic版本数据结构获取令牌测试漏桶的松弛量 总结 本系列 开源限流组件分析(一):juju/ratelimit开源限流组件分析(二):u…

部署前后端分离若依项目--CentOS7宝塔版

准备: CentOS7服务器一台 通过网盘分享的文件:CentOS 7 h 链接: https://pan.baidu.com/s/17DF8eRSSDuj9VeqselGa_Q 提取码: s7x4 大家有需要可以下载这个,密码61 若依前端编译后文件 通过网盘分享的文件:ruoyi-admin.jar 链…

生信软件39 - GATK最佳实践流程重构,提高17倍分析速度的LUSH流程

1. LUSH流程简介 基因组测序通常用于分子诊断、分期和预后,而大量测序数据在分析时间方面提出了挑战。 对于从FASTQ到VCF的整个流程,LUSH流程在非GVCF和GVCF模式下都大大降低了运行时间,30 X WGS数据耗时不到2 h,从BAM到VCF约需…

【计网】UDP Echo Server与Client实战:从零开始构建简单通信回显程序

目录 前言: 1.实现udpserver类 1.1.创建udp socket 套接字 --- 必须要做的 socket()讲解 代码实现:​编辑 代码讲解: 1.2.填充sockaddr_in结构 代码实现: 代码解析: 1.3.bind sockfd和…

linux中级wed服务器(https搭建加密服务器)

一。非对称加密算法: 公钥:公共密钥,开放 私钥:私有密钥,保密 1.发送方用自己的公钥加密,接受方用发送方的私钥解密:不可行 2.发送方用接受方的公钥加密,接受方用自己的私钥解密…

ffmpeg视频滤镜: 色温- colortemperature

滤镜简述 colortemperature 官网链接 》 FFmpeg Filters Documentation 这个滤镜可以调节图片的色温,色温值越大显得越冷,可以参考一下下图: 咱们装修的时候可能会用到,比如选择灯还有地板的颜色的时候,选暖色调还是…

【论文+源码】基于spring boot的垃圾分类网站

创建一个基于Spring Boot的垃圾分类网站涉及多个步骤,包括环境搭建、项目创建、数据库设计、后端服务开发、前端页面设计等。下面我将引导您完成这个过程。 第一步:准备环境 确保您的开发环境中安装了以下工具: Java JDK 8 或更高版本Mav…

Unity URP ShaderGraph 基本设置

先简单了解一下各种渲染管线之间的区别 Unity 从 2019.3 版本开始正式支持通用渲染管线(URP,Universal Render Pipeline)。URP 是轻量渲染管线(LWRP,Lightweight Render Pipeline)的升级和重命名版本&…

【解决】使用Hypermark将Markdown文件转化为HTML文件

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 文章目录 一、文件准备(一)HTML模板文件(二)MD文件夹和储存文件夹 二、文件转…

COSCon'24 志愿者招募令:共创开源新生活!

亲爱的开源爱好者们, 第九届中国开源年会(COSCon24)即将在北京中关村国家自主创新示范区会议中心于2024年11月2日至3日隆重举行。今年的主题是“Open Source, Open Life|开源新生活”,旨在探索开源技术如何在各个领域推…