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

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

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

工厂模式简介

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

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

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

  • 详细分类:

    1. 简单工厂模式

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

    2. 工厂方法模式

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

    3. 抽象工厂模式

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

核心本质:

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

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

简单工厂模式:

// car接口
public interface Car {void name();
}
// 两辆车实现car接口
// 特斯拉
public class Tesla implements Car{@Overridepublic void name() {System.out.println("特斯拉");}
}// 五菱
public class WuLing implements Car{@Overridepublic 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 {@Overridepublic void name() {System.out.println("特斯拉");}
}public class WuLing implements Car {@Overridepublic void name() {System.out.println("五菱宏光");}
}
// 两辆车的工厂实现车工厂接口 重写造车方法
public class TeslaFactory implements CarFactory{@Overridepublic Car getCar() {return new Tesla();}
}public class WuLingFactory implements CarFactory{@Overridepublic 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.rhkb.cn/news/456810.html

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

相关文章

AnaTraf | 全面掌握网络健康状态:全流量的分布式网络性能监测系统

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具AnaTraf网络流量分析仪是一款基于全流量,能够实时监控网络流量和历史流量回溯分析的网络性能监控与诊断系统(NPMD)。通过对网络各个关键节点的监测,收集网络性能…

【计算机网络 - 基础问题】每日 3 题(五十七)

✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…

代谢组数据分析(二十):通过WGCNA识别核心代谢物

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍识别核心基因加载R包导入数据数据预处理检查数据完整性计算软阈值soft根据软阈值构建接矩阵和拓扑重叠矩阵聚类并构建网络拓扑重叠热图查看具体模块的代谢物表达热图识别表型相关模…

sharpkeys-键盘部分按键不好用,用其它不常用按键代替

sharpkeys-键盘部分按键不好用,用其它不常用按键代替 文章目录

linux网络编程5——Posix API和网络协议栈,使用TCP实现P2P通信

文章目录 Posix API和网络协议栈,使用TCP实现P2P通信1. socket()2. bind()3. listen()4. connect()5. accept()6. read()/write(), recv()/send()7. 内核tcp数据传输7.1 TCP流量控制7.2 TCP拥塞控制——慢启动/拥塞避免/快速恢复/快速重传 8. shutdown()9. close()9…

Python游戏开发超详细第二课/一个小游戏等制作过程(入门级篇共2节)

直播内容,这里都用大多用照片代替了哈,因为在写一遍很累,哥哥姐姐理解一下抱歉抱歉 一个是我懒的写一遍,但是刚学的兄弟姐妹可不许学我偷懒哈 二防止有人偷懒,直接复制粘贴代码,所以为了方便帮助你们学习&a…

基于docker 部署redis

1、拉取镜像 docker pull redis:latest如果拉取失败可以尝试下配置镜像源,具体参考如下,目前暂可以使用 Docker切换镜像源-CSDN博客 2、创建配置文件 mkdir /usr/local/redis/conf vim redis.conf bind 0.0.0.0#protected-mode no port 6379 tcp-b…

新手直播方案

简介 新手直播方案 ,低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑(高成本方案) 直播推流方案 需要摄像头 方案一 :手机 电脑同步下载 网络摄像头 软件&#xff08…

【南方科技大学】CS315 Computer Security 【Lab6 IoT Security and Wireless Exploitation】

目录 Introduction (Part 1: OS Security for IoT )Software RequirementsStarting the Lab 6 Virtual MachineSetting up the Zephyr Development EnvironmentDownload the Zephyr Source CodeInstalling Requirements and DependenciesSetting the Project’s Environment Va…

【linux】服务器Ubuntu20.04安装cuda11.8教程

【linux】服务器Ubuntu20.04安装cuda11.8教程 文章目录 【linux】服务器Ubuntu20.04安装cuda11.8教程到官网找到对应版本下载链接终端操作cudnn安装到官网下载下载后解压进入解压后的目录:将头文件复制到 /usr/local/cuda/include/ 目录:将库文件复制到 …

利用客户端导入有关联的业务数据(DBeaver+sql)

前言 最近有点坑,麻辣烫的活落手上了,上个迭代除了自己的开发任务,还有处理接手的工作。然后节后问题又多,还有前1个迭代没有测试的模块本迭代测试,烦死了。 这次这个数据处理的活,以后希望可以交出…

mac电脑设置chrome浏览器语言切换为日语英语等不生效问题

在chrome中设置了语言,并且已经置顶了,但是不生效,在windows上直接有设置当前语言为chrome显示语言,但是mac上没有。 解决办法 在系统里面有一个单独给chrome设置语言的: 单独给它设定成指定的语言,然后重…

川渝地区计算机考研择校分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 添加图片注释,不超过 140 字(可选) 根据最新数据分析,5所高校计算机专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南…

Vision-Language Models for Vision Tasks: A Survey阅读笔记

虽然LLM的文章还没都看完,但是终究是开始看起来了VLM,首当其冲,当然是做一片文献综述啦。这篇文章比较早了,2024年2月份出的last version。 文章链接:https://arxiv.org/abs/2304.00685 GitHub链接:GitHu…

命名空间std, using namespace std

命名空间std&#xff0c;using namespace std 在标准C以前&#xff0c;都是用#include<iostream.h>这样的写法的&#xff0c;因为要包含进来的头文件名就是iostream.h。标准C引入了名字空间的概念&#xff0c;并把iostream等标准库中的东东封装到了std名字空间中&#x…

【linux网络编程】| 网络基础 | 解析IP与Mac地址的区别

前言&#xff1a;本节内容讲解一些网络基础相关的知识点&#xff0c; 不涉及网络代码&#xff01;同样的本节内容是作为前一篇的补充知识点&#xff0c; 前一篇文章地址&#xff1a;【linux网络编程】 | 网络基础Ⅰ| 认识网络-CSDN博客&#xff0c;本篇文章内容较少&#xff0c…

【论文笔记】MLSLT: Towards Multilingual Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: MLSLT: Towards Multiling…

计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法

文章目录 IPv4IPv4的表示方法IPv4的编址方法分类编址A类地址B类地址C类地址可指派的地址数量一般不使用的特殊IPv4地址 划分子网编址子网掩码默认子网掩码 无分类编址方法地址掩码斜线记法无分类域间路由选择 CIDR IPv4 IPv4&#xff08;Internet Protocol version 4&#xff…

麒麟v10 arm64 部署 kubesphere 3.4 修改记录

arm64环境&#xff0c;默认安装 kubesphere 3.4 &#xff0c;需要修改几个地方的镜像&#xff0c;并且会出现日志无法显示 1 fluentbit:v1.9.4 报错 <jemalloc>: Unsupported system page size Error in GnuTLS initialization: ASN1 parser: Element was not found. &…

C++ [项目] 愤怒的小鸟

现在才发现C游戏的支持率这么高&#xff0c;那就发几篇吧 零、前情提要 此篇为 制作,由于他没有CSDN,于是由我代发 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有的自己猜,如果你很固执……私我吧 …