工厂模式--设计模式

news2024/11/25 13:34:04

分类:

在这里插入图片描述

1、简单工厂:可根据自变量的不同返回不同类的实例

应用:将类名和类的全路径放入到配置文件,通过文件流将内容读取放入到map集合中保存,通过反射读取类全路径读取到该类,然后调用类方法。

详细设计:

1、创建Product接口,定义name方法
2、创建Car和TV类实现Product接口并重写name方法
3、创建Product接口工厂,定义获取Car和TV的方法
4、创建Consumer消费者来获取对应对象

话不多说,直接上代码:

public interface Product {
    void name();
}
public class Car implements Product{
    @Override
    public void name() {
        System.out.println("我是汽车!");
    }
}
public class TV implements Product{
    @Override
    public void name() {
        System.out.println("我是电视机!");
    }
}
public class ProductFactory {
    public static Product getProduct(String name) {
        if ("Car".equalsIgnoreCase(name)) {
            return new Car();
        } else if ("TV".equalsIgnoreCase(name)) {
            return new TV();
        } else {
            return null;
        }
    }
}
public class Consumer {
    public static void main(String[] args) {
        Product car = ProductFactory.getProduct("Car");
        Product tv = ProductFactory.getProduct("TV");
        car.name();
        tv.name();
    }
}

输出结果:

我是汽车!
我是电视机!

简单工厂不好扩展,比如加个新商品空调,修改ProductFactory 类比较繁琐
此时引入了工厂方法

工厂方法

详细设计:

1、创建Product接口,定义name方法
2、创建Car和TV类实现Product接口并重写name方法
3、创建Car和TV接口工厂CarFactory和TVFactory,定义获取Car和TV的方法
4、创建Consumer消费者,通过各自的工厂来获取对应对象

如果再加个新商品,再建个空调Factory即可
工厂方法模式代码比较臃肿,不能满足精简代码的作用

抽象工厂模式

工厂的工厂

详细设计:

1、创建Car接口定义run方法
创建TV接口定义look方法
2、创建AudiBMW类实现Car接口并重写run方法
创建LeTVSony类实现TV接口并重写look方法
3、创建Factory接口定义生产CarTV的方法
4、创建FactoryA类并重写CarTV方法,创建AudiLeTV对象
创建FactoryB类并重写CarTV方法,创建BWMSony对象
5、创建Consumer消费者,new FactoryA可以获取到对应的AudiLeTV对象
创建Consumer消费者,new FactoryB可以获取到对应的BWMSony对象

场景:

有小米和华为两个厂商
各自工厂生产手机和路由器
手机和路由器有各自的功能
手机:打电话和发短信
路由器:打开和关闭Wifi

详细设计:

1、创建IPhoneProduct接口定义callUp和sendMsg方法
创建IRouterProduct接口定义openWifi和closeWifi方法
2、创建XiaomiPhoneHuaweiPhone类实现IPhoneProduct接口并重写对应方法
创建XiaomiRouterHuaweiRouter类实现IRouterProduct接口并重写对应方法
3、创建IProductFactory接口定义生产PhoneRouter的方法
4、创建XiaomiFactory类实现IProductFactory接口并重写PhoneRouter的方法,创建XiaomiPhoneXiaomiRouter对象
创建HuaweiFactory类实现IProductFactory接口并重写PhoneRouter的方法,创建HuaweiPhoneHuaweiRouter对象
5、创建Consumer消费者类,new XiaomiFactory可以获取到对应的phoneProduct和routerProduct对象
然后调用各自商品的方法

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

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

相关文章

山东大学2022算法期末

接力:山东大学2021算法期末 2022 SDU算法导论期末考试 2020 计科 计算题 三道 35’ (1) 画BFS树 (2) 做DFS说明各种边的分类使用floyd或者矩阵乘法求全源最短路,求最短路矩阵以及前驱矩阵(3个点,比较友好,应该没有…

idea推送镜像到desktop报错:Cannot run program “docker-credential-desktop“ 系统找不到指定的文件。

windows Docker 搭建仓库 打开docker desktop 。 打开windows cmd窗口或powershell窗口。 输入"docker run -d -p 5000:5000 --name test registry:2 "运行一个名字叫test的registry容器。 idea配置springboot项目的docker插件 在pom.xml中的plugins中加入下面代码…

Kaldi语音识别技术(五) ----- 特征提取

Kaldi语音识别技术(五) ----- 特征提取 文章目录Kaldi语音识别技术(五) ----- 特征提取一、识别流程二、MFCC特征提取概述三、文件格式文件格式说明提取部分数据修复提取数据提取剩余部分数据四、特征提取特征提取—C特征提取—并行提取特征提取—特征查看五、CMVNCMVN—脚本CM…

SpringMVC执行流程(面试题)

SpringMVC是Spring框架中的组成成员之一,是一个针对于Web开发的一个类似于Servlet技术的一个web应用框架,它包含了MVC架构的特点,让Web变得更加简单。在SpringMVC框架中,一个比较核心的组件就是他的前端控制器,这个前端…

sql复习(子查询、创建和管理表)

一、子查询 子查询 (内查询) 在主查询之前一次执行完成 子查询的结果被主查询(外查询)使用 1.单行子查询 只返回一行,使用单行比较操作符。 --谁的工资比Able高? select last_name,salary from employees where salary > (select salaryfrom empl…

idea插件生成dao类service类controller类以及mapper.xml

idea插件生成dao类service类controller类以及mapper.xml 安装插件Easycode和MybatisX,不用自己写代码 1.Files——》Settings——》Plugins,分别搜索Easycode和MybatisX,点击下载。 2.新建一个springboot模板,选择的依赖如下 3.…

初探Spring采用Spring配置文件管理Bean

文章目录Spring容器演示--采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Spring依赖(三)创建杀龙任务类(四)创建勇敢骑士类(五)采用传统方式让勇敢骑士…

JAVA内存模型(JMM)

JMM一、JMM——原子性-(synchronized)二、JMM——可见性-问题2.1 退不出的循环2.2 可见性——解决2.3 可见性三、JMM——有序性-问题3.1 诡异的结果3.2 解决方法3.3 有序性理解3.4 happens-beforeJMM 即 Java Memory Model,简单地说,JMM定义了一套在多线…

JVM - 字节码执行引擎

目录 栈帧和局部变量表 概述 栈帧概述 栈帧概念结构 局部变量表 slot是复用的实例 操作数栈 概述 动态连接 方法调用 静态分派和动态分派 栈帧和局部变量表 概述 JVM的字节码执行引擎,功能基本就是输入字节码文件,然后对字节码进行解析并处理…

jdk19下载与安装教程(win10)超详细

一、下载安装步骤 1、官网下载还需要注册,可以点【我的网盘】目录下载,目录也有其它低版本的,如果有需要大家根据需要自行选择。 2、下载后直接点击安装程序,点击【运行】。这里我使用的是64位的。 3、点击【下一步】。 4、默认安…

28-Golang中的数组

Golang中的数组数组介绍数组的定义和内存布局数组的定义数组的内存图数组 的使用访问数组元素案例四种初始化的方式for-range结构遍历基本语法说明案例数组使用注意事项和细节数组应用案例1.创建一个byte类型的26个元素的数组,分别放置A-Z。使用for循环访问所有元素…

分享SEO优化的8个技巧

什么是SEO? SEO是Search Engine Optimization的缩写,直译过来就是“搜索引擎优化”的意识。故名意思,SEO是一种优化(提高)网站在搜索引擎内的自然排名的行为的统称。 当里个当,当里个当,闲言碎语不要讲&a…

Web应用程序自动化测试工具Selenium的主要功能有哪些?

Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium可以直接运行在浏览器上,它支持…

VSCode最新版本下载安装详细教程(win10)

VSCode是Microsoft发布的一款运行于多个操作系统,针对于编写现代Web和云应用的跨平台的源代码编辑器, 可在桌面上运。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C,C&…

vue-echarts实现多功能图表

前言作为前端人员,日常图表、报表、地图的接触可谓相当频繁,今天小编隆重退出前端框架之VUE结合百度echart实现中国地图各种图表的展示与使用;作为“你值得拥有”专栏阶段性末篇,值得一看主要实现功能——中国地图——环形图——折…

Springboot扩展点之DisposableBean

前言DisposableBean,是在Spring容器关闭的时候预留的一个扩展点,从业务开发的角度来看,基本上是用不到的,但是Spring容器从启动到关闭,是Spring Bean生命周期里一个绕不开的节点,因此还是有必要学习一下&am…

Web3中文|关于以太坊“上海升级”,你需要知道哪些?

今年3月,以太坊将进行自2022年9月转向权益证明系统以来的首次大升级,即上海硬交叉。一旦以太坊完成“上海升级”,帮助运营网络的验证者将能够提取1600万枚被质押的以太币(ETH)。 除了重点落实以太坊改进建议——4895&…

吉林电视台启用乾元通多卡聚合系统广电视频传输解决方案

随着广播电视数字化、IP化、智能化的逐步深入,吉林电视台对技术改造、数字设备升级提出了更高要求,通过对系统性能、设计理念的综合评估,正式启用乾元通多卡聚合系统广电视频传输解决方案,将用于大型集会、大型演出、基层直播活动…

idea使用本地代码远程调试线上运行代码---linux环境

场景: 之前介绍过windows环境上,用idea进行远程调试那么在linux环境下实战一下 环境: linux 测试应用:使用docker部署的platform-multiappcenter-base-app-1.0.0-SNAPSHOT.jar 应用 测试应用端口:19001 测试工具&…

工欲善其事,必先利其器,分享5款Windows效率软件

工欲善其事,必先利其器。作为全球最多人使用的桌面操作系统,Windows 的使用效率与我们的工作学习息息相关。今天,小编就为大家整理了5款提高效率的利器,让你的 Windows 更具生产力。 1.桌面自定义——Rainmeter Rainmeter是一款…