【java学习—九】工厂方法FactoryMethod(6)

news2024/11/16 3:26:51

文章目录

  • 1. 概念
  • 2. 实际的应用


1. 概念

    FactoryMethod 模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。 FactoryMethod 解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。

听不懂是吧?下面直接举例说明:

2. 实际的应用

在这里插入图片描述
注:图中原作者出现笔误,BMW错拼成了BWM
上图中①是BMW的产品接口,②是产品工厂的接口。

代码实现:
(1)开发人员A的工作
接口BMW.java:

package day09;
/**
 * 宝马车的产品接口
 * @author 14532
 *
 */
public interface BMW {
	//产品的信息介绍
	//车的发动方式
	void showInfo();
}


/**
 * 构建具体的车的类
 * @author 14532
 *
 */
class BMW3 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马3系车");
	}
}

class BMW5 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马5系车");	
	}
}

class BMW7 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马7系车");		
	}
}

接口BMWFactory.java:

package day09;
/**
 * 汽车生产工厂接口
 * @author 14532
 *
 */
public interface BMWFactory {
	BMW productBMW();
}

/**
 * 实现具体的车型的生产工厂
 * @author 14532
 *
 */
class BMW3Factory implements BMWFactory{

	@Override
	public BMW productBMW() {
		System.out.println("生产宝马3系车");
		return new BMW3();
	}
}


class BMW5Factory implements BMWFactory{

	@Override
	public BMW productBMW() {
		System.out.println("生产宝马5系车");
		return new BMW5();
	}
}


class BMW7Factory implements BMWFactory{

	@Override
	public BMW productBMW() {
		System.out.println("生产宝马7系车");
		return new BMW7();
	}
}

(2)开发人员B的工作:
Test.java:

package day09;

public class Test2 {
	public static void main(String[] args) {
		//这是开发人员B的工作
		BMW b3 = new BMW3Factory().productBMW();
		b3.showInfo();
		
		BMW b5 = new BMW5Factory().productBMW();
		b5.showInfo();
		
		BMW b7 = new BMW7Factory().productBMW();
		b7.showInfo();
	}

}

运行结果:
在这里插入图片描述

如果现在需要对宝马3系的车进行改造,改成宝马3i,该如何实现:
BMW.java中class BMW3 implements BMW{改成class BMW3i implements BMW{
BMWFactory.java中return new BMW3();改成return new BMW3i();
为了区别改造的,在类BMW3Factory中添加一段输出System.out.println("改造3系车,定名为BMW3i型号");
更改后的代码:

(1)开发人员A的工作产生了变化:
接口BMW.java:

package day09;
/**
 * 宝马车的产品接口
 * @author 14532
 *
 */
public interface BMW {
	//产品的信息介绍
	//车的发动方式
	void showInfo();
}


/**
 * 构建具体的车的类
 * @author 14532
 *
 */
class BMW3i implements BMW{//更改为BMW3i
	@Override
	public void showInfo() {
		System.out.println("这个是宝马3系车");
		
	}
}

class BMW5 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马5系车");
		
	}
}

class BMW7 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马7系车");
		
	}
}


接口BMWFactory.java:

package day09;
/**
 * 汽车生产工厂接口
 * @author 14532
 *
 */
public interface BMWFactory {
	BMW productBMW();
}

/**
 * 实现具体的车型的生产工厂
 * @author 14532
 *
 */
class BMW3Factory implements BMWFactory{//在BMW3Factory中改造BMW3为BMW3i

	@Override
	public BMW productBMW() {
		System.out.println("生产宝马3系车");
		System.out.println("改造3系车,定名为BMW3i型号");
		return new BMW3i();//返回BMW3i
	}
	
}


class BMW5Factory implements BMWFactory{

	@Override
	public BMW productBMW() {
		System.out.println("生产宝马5系车");
		return new BMW5();
	}
	
}


class BMW7Factory implements BMWFactory{

	@Override
	public BMW productBMW() {
		System.out.println("生产宝马7系车");
		return new BMW7();
	}
	
}



(2)开发人员B的工作没有变化:
Test.java:

package day09;

public class Test2 {
	public static void main(String[] args) {
		//这是开发人员B的工作
		BMW b3 = new BMW3Factory().productBMW();
		b3.showInfo();
		
		BMW b5 = new BMW5Factory().productBMW();
		b5.showInfo();
		
		BMW b7 = new BMW7Factory().productBMW();
		b7.showInfo();
	}

}

输出结果:
在这里插入图片描述

通过工厂把new对象给隔离,通过产品的接口可以接收不同实际产品的实现类。实现的类名的改变不影响其他合作开发人员的编程。

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

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

相关文章

RabbitMQ初入门

1、RabbitMQ是什么 RabbitMQ是“实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…

23 行为型模式-迭代器模式

1 迭代器模式介绍 迭代器模式是我们学习一个设计时很少用到的、但编码实现时却经常使用到的行为型设计模式。在绝大多数编程语言中,迭代器已经成为一个基础的类库,直接用来遍历集合对象。在平时开发中,我们更多的是直接使用它,很…

C++学习 day--21 地震监测系统实现、内存泄漏检测工具

1、项目需求 地震监测系统主要是利用地震检波器收集到的地壳运动信息,从而预测和确定地震的震中以 及强度。 预测方法 地震检波器每隔固定的时间间隔采样一次预测地震的能量数据,并保存到文件中,地震监测 系统会从文件中读取相应的能量数据&…

第四章 文件管理 十二、虚拟文件系统

目录 一、虚拟文件系统图 二、虚拟文件系统的特点 三、存在的问题 四、文件系统挂载 一、虚拟文件系统图 二、虚拟文件系统的特点 1、向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异。 2、VFS要求下层的文件系统必须实现某些规定的…

Map集合 遍历:lambda方式

package day01;import java.util.*;public class Mapday1 {public static void main(String[] args) {/* HashMap 无序 不重复&#xff0c;会覆盖前面 无索引*/System.out.println("--------------------");Map<String, Integer> map new HashMap<>();m…

【DBeaver】建立连接报驱动问题

事件 在DBeaver中建立pgsqlite连接&#xff0c;测试连接时&#xff0c;报 can’t load driver class ‘org.postgresql.Driver’ 问题原因 pgsqlite数据库驱动与DBeaver版本不匹配 pg解决办法 在https://jdbc.postgresql.org/download/中下载最新版本的驱动&#xff0c;然…

【Java基础】反射机制与动态代理机制

反射机制与动态代理机制 文章目录 反射机制与动态代理机制1. 反射(Reflection)的概念1.1 反射概述1.2 反射的优缺点 2. 理解Class类并获取Class实例2.1 Class2.2 Class类的常用方法 3. 反射的基本应用3.1 应用1&#xff1a;创建运行时类的对象3.2 应用2&#xff1a;调用运行时类…

什么是恶意代码?

前言&#xff1a;本文旨在分享交流技术&#xff0c;在这里对恶意代码进行全面的介绍和讲解 目录 一.什么是恶意代码 二.恶意代码的发展史 三.恶意代码的相关定义 四.恶意代码攻击机制 PE病毒 PE文件的格式 脚本病毒 脚本文件隐藏方法 宏病毒 浏览器恶意代码 U盘病毒 …

Go基础——数组、切片、集合

目录 1、数组2、切片3、集合4、范围&#xff08;range&#xff09; 1、数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列&#xff0c;这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。 Go 语言数组声明需要指定元素类型及元素个数&#xff0c;与…

docker - DockerFile 编写 指令

文章目录 前言docker - DockerFile 编写 指令1. FROM2. MAINTAINER3. RUN4. CMD5. LABEL6. EXPOSE7. ENV8. ADD9. COPY10. ENTRYPOINT11. VOLUME12. USER13. WORKDIR14. ARG15. ONBUILD16. STOPSIGNAL 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&am…

Virtual DOM

目录 Virtual DOM 前言 用法 代码 理解 Virtual DOM的工作原理&#xff1a; 为什么使用Virtual DOM? 哪些库/框架使用Virtual DOM? 总结 Virtual DOM&#xff08;虚拟DOM&#xff09;是一种编程概念&#xff0c;它是对真实DOM的轻量级抽象表示。在前端开发中&#x…

【软考】系统集成项目管理工程师(九)项目成本管理【4分】

一、成本概念 1、产品全生命周期成本 产品或系统的整个使用生命周期内&#xff0c;在获得阶段&#xff08;设计、生产、安装和测试等活动&#xff0c;即项目存续期间&#xff09;、运营与维护、生命周期结束时对产品的处置所发生的全部成本 2、成本类型 成本类型描述可变成…

【Matlab2016】Matlab中文版的下载、安装、激活(不建议安装过高版本!!)

这里写目录标题 首先双击R2016_win64.iso加载镜像文件双击setup.exe开始安装选择使用文件密钥安装填入密钥修改安装路径并记住此路径建议全部勾选等待安装完成 激活复制补丁到matlab路径下 创建快捷方式进入bin目录&#xff0c;找到matlab.exe 安装包 首先双击R2016_win64.iso加…

会声会影2023永久激活序列号密钥(支持各版本会声会影注册机)

会声会影2023永久激活序列号密钥(支持各版本)。会声会影2023是一款强大专业的视频编辑软件。会声会影2023产品序列号&#xff0c;支持专业版和旗舰版&#xff0c;可免费激活会声会影2023软件。会声会影2023序列号激活码目前网上很难找到了&#xff0c;这些会声会影序列号是小编…

如何编写一份完整的软件测试报告?

背景 作为测试从业者&#xff0c;编写测试用例&#xff0c;测试计划&#xff0c;测试报告都是必经之路&#xff0c;最近完成了年终述职以及版本准出&#xff0c;感觉测试报告或者各类报告真是职场人不可或缺的一项技能&#xff0c;趁着热乎劲&#x1f525;&#xff0c;写下一些…

Spring Cloud 实战 | 解密负载均衡Ribbon底层原理,包含实战源码

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

车载音频ADI-ADSP21569音频DSP开发

车载音频ADI-ADSP21489音频DSP开发 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送蓝牙音频,车载DSP音频项目核心开发资料, 1 芯片手册 2 电路原理图

fl studio2023最新版本如何设置中文?

FL Studio编曲软件真的是个神器&#xff0c;不过一开始打开看到全是英文&#xff0c;有点头大&#xff0c;对吧&#xff1f;其实切换成中文版超级简单&#xff0c;只需要几个步骤就搞定啦&#xff01;我自己也是用中文版的&#xff0c;觉得用起来更得心应手&#xff0c;效率也提…

分享一个基于asp.net的供销社农产品商品销售系统的设计与实现(源码调试 lw开题报告ppt)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…