《研磨设计模式》chap6 工厂模式factory(2)案例实现

2024-03-28 09:58

本文主要是介绍《研磨设计模式》chap6 工厂模式factory(2)案例实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 用工厂模式实现案例
在这里插入图片描述

public interface ExportFileApi {//导出内容成为文件 	 public boolean export(String data);
}public class ExportDB implements ExportFileApi{public boolean export(String data) { }
}public class ExportTxt implements ExportFileApi{public boolean export(String data) { }
}//实现导出数据的业务功能对象 
public abstract class ExportOperate {//导出文件 public boolean export(String data){//使用工厂方法ExportFileApi api = factoryMethod();return api.export(data);}//工厂方法,创建导出的文件对象的接口对象 protected abstract ExportFileApi factoryMethod();
}public class ExportDBOperate extends ExportOperate{protected ExportFileApi factoryMethod() {//创建导出成数据库备份文件形式的对象return new ExportDB();}
}public class ExportTxtFileOperate extends ExportOperate{ protected ExportFileApi factoryMethod() {//创建导出成文本文件格式的对象return new ExportTxtFile();} 
}public static void main(String[] args) {//创建需要使用的Creator对象ExportOperate operate = new ExportDBOperate();//调用输出数据的功能方法operate.export("测试数据");}

2. IoC/DI

IoC——InversionofControl, 控制反转
DI——DependencyInjection, 依赖注入

public class A { private C c = null;//等待被注入进来 //注入资源C的方法 public void setC(C c){this.c = c;}public void t1(){//这里需要使用C类,可是又不让主动去创建C了,怎么办?//反正就要求从外部注入,这样更省心,//自己不用管怎么获取C,直接使用就好了c.tc();}
}

优化为:

public abstract class A1 {//工厂方法,创建C1,类似于从子类注入进来的途径 protected abstract C1 createC1();public void t1(){//这里需要使用C1类,可是不知道究竟是用哪一个,也就不主动去创建C1了,怎么办?//反正会在子类里面实现,这样更省心,这里不用管怎么获取C1,直接使用就好了createC1().tc();}
}public class A2 extends A1 {protected C1 createC1() {//真正的选择具体实现,并创建对象return new C2();}
}

3. 平行的类层次
在这里插入图片描述
4. 参数化工厂

依赖倒置原则告诉我们“要依赖抽象, 不要依赖于具体类”, 简单点说就是: 不能让高层组件依赖于低层组件, 而且不管高层组件还是低层组件, 都应该依赖于抽象。

eg. ExportOperate 提供type参数,假设要新增加一个xml文件输出类,增加type ==3.

public interface ExportFileApi {//导出内容成为文件 public boolean export(String data);
}public class ExportDB implements ExportFileApi{public boolean export(String data) {//简单示意一下,这里需要操作数据库和文件System.out.println("导出数据"+data+"到数据库备份文件");return true;}
}public class ExportTxtFile implements ExportFileApi{public boolean export(String data) {//简单示意一下,这里需要操作文件System.out.println("导出数据"+data+"到文本文件");return true;}
}public class ExportXml implements ExportFileApi{public boolean export(String data) {//简单示意一下System.out.println("导出数据"+data+"到XML文件");return true;}
}public class ExportOperate {//导出文件 public boolean export(int type,String data){//使用工厂方法ExportFileApi api = factoryMethod(type);return api.export(data);}//工厂方法,创建导出的文件对象的接口对象 protected ExportFileApi factoryMethod(int type){ExportFileApi api = null;//根据类型来选择究竟要创建哪一种导出文件对象if(type==1){api = new ExportTxtFile();}else if(type==2){api = new ExportDB();}return api;}
}public class ExportOperate2 extends ExportOperate{//覆盖父类的工厂方法,创建导出的文件对象的接口对象 protected ExportFileApi factoryMethod(int type){ExportFileApi api = null;//可以全部覆盖,也可以选择自己感兴趣的覆盖,//这里只想添加自己新的实现,其他的不管if(type==3){api = new ExportXml();}else{//其他的还是让父类来实现api = super.factoryMethod(type); }return api; }
}public static void main(String[] args) {
//		//创建需要使用的Creator对象
//		ExportOperate operate = new ExportOperate();
//		//调用输出数据的功能方法,传入选择到处类型的参数
//		operate.export(1,"测试数据");//创建需要使用的Creator对象ExportOperate operate = new ExportOperate2();//下面变换传入的参数来测试参数化工厂方法operate.export(1,"Test1");operate.export(2,"Test2");operate.export(3,"Test3");}

5. 总结

工厂方法模式的本质:延迟到子类来选择实现。

这篇关于《研磨设计模式》chap6 工厂模式factory(2)案例实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855287

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定