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

news2024/10/27 4:56:23

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

简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子: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

 

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

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

相关文章

Spring Boot框架下中小企业设备管理系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理中小企业设备管理系统的相关信息成为必然。…

Kafka-代码示例

一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…

最长子序列模型二(二分优化版)

文章目录 提高课题解一、拦截导弹二、导弹防御系统三、最长公共上升子序列四、二分函数速写 基础课题解五、最长上升子序列 II 提高课题解 一、拦截导弹 题目链接 第一问非常简单&#xff0c;直接用之前最长上身子序列模板就行 第二问就有难度了&#xff0c;我们要用最少的递…

基于SSM“毛毛宠物店”宠物信息交流平台的设计与实现

开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myec…

DEV-C++如何调试

1、先编译&#xff0c;再点击“调试”按钮 2、使用调试按钮&#xff0c;可以输入输出数据 第21次发博客 以后会慢慢更新

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构

从零开始认识IP协议 1 网络层协议1.1 初步认识IP协议1.2 初步理解IP地址 2 IP协议报头3 初步理解网段划分 1 网络层协议 1.1 初步认识IP协议 我们已经熟悉了传输层中的UDP和TCP协议&#xff0c;接下来我们来接触网络层的协议&#xff1a; 网络层在计算机网络中的意义主要体现…

EXCELL中如何两条线画入一张图中,标记坐标轴标题?

1&#xff0c;打开excel&#xff0c;左击选中两列&#xff0c; 2&#xff0c;菜单栏>“插入”>”二维折线图”选中一个 3&#xff0c;选中出现的两条线中的一条右击>最下一行&#xff0c;“设置数据系列格式” 4&#xff0c;右测“系列选项中”>点击“次坐标轴” 5…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

颐驰06持续交付,明日科技赋能出行生活

在全球智能出行领域&#xff0c;自动驾驶技术的发展一直是行业关注的焦点。不久前&#xff0c;特斯拉发布的自动驾驶出租车引发了全球关注&#xff0c;但由于缺乏具体的技术细节&#xff0c;导致投资者信心受挫&#xff0c;特斯拉股票一度下跌近10%。与此同时&#xff0c;中国车…

智能台灯设计(一)原理图设计

1. 前言 作者最近突发奇想&#xff0c;想自己做一个小台灯&#xff0c;设想的功能有&#xff1a;带锂电池可充电、可以调节亮度&#xff0c;后续通过增加WIFI模块实现手机控制开关功能。目前先实现最简单的功能&#xff0c;有时间再一步步完善吧。 2. 原理图设计 充电芯片使用…

常用的三角公式

目录 1. 基本公式​ 2. 倍角公式​ 3. 半角公式​ 4. 和差公式​ 5. 和差化积​ 6. 积化和差​ 7. 万能公式​ 1. 基本公式 2. 倍角公式 3. 半角公式 4. 和差公式 5. 和差化积 6. 积化和差 7. 万能公式

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning&#xff0c;在講self-supervised learning之前呢&#xff0c;就不能不介紹一下芝麻街&#xff0c;為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…

第九部分 Java API

第九部分 Java API 9.1 Java Number & Math 9.1.1 Java Number类 一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 实例 int a 5000; float b 13.65f; byte c 0x4a;然而&…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

VUE中文本域默认展示最底部内容

文本域内容 <textarea ref"textareaRef" style"width: 100%; resize: none;" readonly v-model"errorLog" rows"15"></textarea> 样式展示 this.$nextTick(() > { // 使用$refs获取文本域的DOM元素 const textareaInfo…

SwiftUI:单个App支持设置多语言

SwiftUI 全新多语言方案 简化本地化的字符串- WWDC21 - 视频 本地化您的SwiftUI app - WWDC21 - 视频 构建全球化App&#xff1a;本地化的示例- WWDC22 - 视频 构建支持多语言的App - WWDC24 - 视频 单个App支持设置多语言 工程 Info.plist里添加 键值UIPrefersShowingLangua…

解析三相220V与三相380V变频器的关键差异

在工业自动化的广阔舞台上&#xff0c;作为电力电子技术的杰出代表&#xff0c;扮演着调节电机速度、优化能源利用的重要角色。本文将深入探讨三相220V与三相380V变频器之间的九大核心区别&#xff0c;帮助读者更全面地理解这两种设备的应用特性。 一、电压等级&#xff1a;基础…

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客 前两章节我们讲解了使用AI Navigator软件搭建本机大模型&#xff0c;并使用python对大模型api进行调用&#xff0c;使其流式返…

【线下培训】龙信科技应邀参与了由教育部网络安全与执法虚拟教研室(中国刑事警察学院)举办的学术讲座

文章关键词&#xff1a;电子数据取证培训、产学研推进、手机取证、介质取证 2024年10月23日&#xff0c;龙信科技应邀参与了由教育部网络安全与执法虚拟教研室&#xff08;中国刑事警察学院&#xff09;举办的学术讲座。在这次学术交流中&#xff0c;我们公司的技术专家陈杰以…

使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 .NET MAUI可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 使用 .NET MAUI 开发第一个 Android 应用是一个直观的过程&#xff0c;…