java 对象工厂_Java设计模式之--工厂方式

在分析工厂模式之前,我们先看看普通模式下的Java三层结构。

Controller(表现层)-Service(业务层)-Dao(持久层、数据库连接层),基于此三层结构完成JavaWeb相关业务。

假设我们要完成的业务是添加员工信息,

先创建Dao包,创建EmpDao接口和EmpDaoFactory实现类。Dao包结构.pngpackage com.yd.dao;

/**

* 员工模块Dao(持久层)接口

*

*/

public interface EmpDao {

// 添加员工信息

public void addEmp();

}package com.yd.dao;

/**

* 员工模块Dao(持久层)接口实现类

*

*/

public class EmpDaoImpl implements EmpDao{

public void addEmp() {

System.out.println("Dao层的addEmp()方法执行了..");

}

}

再创建Service包,创建EmpService接口和EmpServiceImpl实现类,在实现类中创建Dao接口的子类对象,这样做是程序之间的耦合性上升。

f9d15ea9b8aa5374df681f26b1fed30f.pngpackage com.yd.service;

/**

* 员工模块的service(业务层)接口

*

*/

public interface EmpService {

// 添加员工信息

public void addEmp();

}package com.yd.service;

import com.yd.dao.EmpDao;

import com.yd.dao.EmpDaoImpl;

/**

* 员工模块的service(业务层)接口实现类

*

*/

public class EmpServiceImpl implements EmpService{

//调用Dao接口的子类对象

//new对象使程序之间的耦合性上升

private EmpDao dao=new EmpDaoImpl();

public void addEmp() {

System.out.println("调用dao层的方法添加员工信息");

}

}

最后创建controller包,在包中创建EmpController类package com.yd.controller;

import org.junit.Test;

import com.yd.service.EmpService;

import com.yd.service.EmpServiceImpl;

/**

* 模拟表现层

* controller-> service-> dao

*

*/

public class EmpController {

/**

* 获取service接口的子类实例

* new对象造成程序耦合性上升

*/

//EmpService成员变量手动属性注入,属性注入了一个EmpServiceImpl对象。

private EmpService service=new EmpServiceImpl();

@Test

public void testAddEmp() {

System.out.println("调用service层的方法添加员工信息");

service.addEmp();

}

}

我们可以发现,在EmpServiceImpl类中创建了EmpDaoImp类的对象,两个类之间的耦合性上升;在EmpController类中创建了EmpSericeImpl对象,两个类之间的耦合性上升。

直接new对象使程序的耦合性上升,为日后的维护升级带来麻烦。

工厂方式解耦,完美解决了模块之间的耦合性过高的问题。

工厂模式,顾名思义,就是建立一个对象工厂,利用工厂来创建每个实现类的对象。就像工厂生产手机、电脑等工业品一样,这个工厂什么对象都能造!

在改造以上代码之前,先了解一些概念。

bean:可重用组件

JavaBean:java语言编写的可重用组件,例如service层,dao层,Controller层。

bean分为业务bean和实体bean。

业务bean:处理业务逻辑,service层和Dao层

实体bean:封装数据,相当于mvc设计模式的model、POJO,自己编写的Emp实体类。

如何解耦?提供配置文件,在配置文件中配置service和dao的实现类

通过工厂读取配置文件中的全限定类名,利用反射创建对象,如.properties和.xml文件

改造上面的代码,第一步:创建一个Factory包和BeanFatory类。

d1ca8e29927799098b9bc12c60382a7a.pngpackage com.yd.Factory;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

public class BeanFactory {

//声明一个Properties对象,在静态代码块中初始化

private static Properties prop;

static {

//prop实例化

prop = new Properties();

//获取配置流对象,得到配置文件的内容

InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("config.properties");

try {

//将配置文件中的内容读到Prop对象中

prop.load(inputStream);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("初始化properties对象失败");

}

}

/**

* 根据config.xml文件中的key获取对应的class类实例

* @param key

* @return bean

*/

public static Object getBean(String key) {

Object bean=null;

try {

//得到key对应的value值,并创建对象

String className = prop.getProperty(key);

bean = Class.forName(className).newInstance();

} catch (Exception e) {

e.printStackTrace();

}

return bean;

}

}

在以上代码中,首先声明了properies类的对象prop,利用反射机制(ClassName.class)和ClassLoader类加载器中的getResourceAsStream(),将配置文件以流的形式读取出来,prop加载此流的信息,读取到配置文件。

prop对象根据传入key获取对应的value,value就是类的全限定类名,根据此类名利用反射机制创建想要对象。并返回给调用者。

第二步:在根目录下创建config.properies文件EmpService=com.yd.service.EmpServiceImpl

EmpDao=com.yd.dao.EmpDaoImpl

第三步:在EmpController类中添加如下代码//工厂方式解耦

//获取Service接口的子类实例

private EmpService service=(EmpService) BeanFactory.getBean("EmpSerice");

//获取Dao接口的子类实例

private EmpDao empDao=(EmpDao) BeanFactory.getBean("EmpDao");

@Test

public void testAddEmp() {

System.out.println("工厂方式调用service层的方法添加员工信息");

service.addEmp();

}

工厂模式本质就是利用Java的反射机制和ClassLoader类加载器,为开发者提供一个创建类的统一接口。开发者只需要调用Beanfactory(),配合.properties文件,就能创建实例,调用方法。

基于工厂模式,大佬和高手开发出了强大的工具spring和springboot,spring以IOC(Inverse Of Control:控制反转)和AOP(Aspact Oriented Programming:面向切面编程)为核心,整合开源世界的大多数第三方框架,成为使用最多的JavaEE企业应用开源框架。

spring的本质就是管理程序的对象,即创建对象和维护对象之间的关系。

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

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

相关文章

mysql 5.7 io 性能 aio_深入理解MySQL的InnoDB引擎

在MySQL中的引擎一文中说了,我们在几乎所有的情况下其实用的都是InnoDB引擎,这里我们就重点再看一下这个引擎,包括他的存储结构,线程模型和数据文件。我们可以通过show engine innodb status \G;(\G只是表示输出结果纵向表格输出)…

mysql 使用场景_MySQLMHA典型使用场景

1 管理节点部署位置1.1. Dedicated Manager server and multiple MySQL (master,slaves) servers 使用专用的管理服务1 管理节点部署位置1.1. Dedicated Manager server and multiple MySQL (master,slaves) servers使用专用的管理服务器管理多组MySQL主从服务器Since MHA Mana…

mysql构建数据立方体_OLAP数据建模工具Workbench的初步使用(数据立方体的建立)

OLAP数据建模工具Workbench的初步使用(数据立方体的建立)概要:1.workbench工具简介2.workbench简单操作(附demo)3.workbench初步使用总结1.workbench工具简介OLAP,(Online Analytical Processing,联机分析处理)。从事相关工作的小伙伴,具体的…

mysql访问60s出现timeout_websocket 每60s报WsHttpUpgradeHandler.timeoutAsync

在后台连接了一个websocket连接,每60s就报如下错误,有知道这是什么情况的吗?2020-09-10 14:22:40 [Catalina-utility-1] ERROR org.apache.coyote.http11.Http11NioProtocol -Error processing async timeoutsjava.util.concurrent.Execution…

java 类 方法继承_java – 在方法重写中返回继承的类而不是超类

我有一个看起来像这样的类结构:class Parent {public Parent(int property) { /* use property */}}class Son extends Parent {public Son(int parentProperty, String sonProperty) {super(parentProperty);/* use son property */}}我想为这两个类创建构建器,以便…

python环绕文字_如何用css实现文字三面环绕图片?

html部分:DIV with content or Image in the Middle of the text Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam rhoncus nibh ipsum, nec tincidunt mauris suscipit non. Nullam euismod est in dui vehicula ornare quis non nulla. Sed ul…

java写入数组_如何在Java中将数组写入outputStream

我想通过Socket发送多个随机值.我认为数组是发送它们的最佳方式.但是我不知道如何将数组写入Socket outputStream?import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.Socket;import java.io.*;import j…

java循环1000000000_求十亿内所有质数的和,怎么做最快?

注:对知乎的公式编辑功能实在无力吐槽,用typora写的文章直接粘过来公式无法显示,只好又手工加上了全部公式,不过可能还是会有遗漏。大家可以点击这个链接 查看我的博客原文。以下是正文:第一次关注到这个问题是在做pro…

java推送Comet_使用Comet4j实现消息推送

public class NewMsgCollector extends ConnectListener implements ServletContextListener {private static final String CHANNEL "hello";public void contextInitialized(ServletContextEvent contextEvent) {//注册应用的channelCometContext context CometC…

java飞行记录器是什么_运行java飞行记录器JFR(java flight recorder)

JFR上面讲到的工具都是作为快速的查看诊断工具的。如果要深入分析问题,可以选择使用内置的Java飞行记录器:Java Mission Control。转储JFR需要三步:1. 创建一个包含了你自己配置的JFR模板文件。运行jmc, 然后Window->Flight Recording Template Manag…

java申请安卓权限_java4android (包和访问权限)

什么是Java当中的软件包?为什么要使用软件包?如何给一个类打包?//将类放置到一个包中,需要使用package“包名”//打包 编译的方法 javac -d . Test.java//出现错误:编码GBK的不可映射字符 javac -encoding UTF-8 -d . …

java圆形泳池问题_Java实现 LeetCode 778 水位上升的泳池中游泳(二分+DFS)

778. 水位上升的泳池中游泳在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。现在开始下雨了。当时间为 t 时,此时雨水导致水池中任意位置的水位为 t 。你可以从一个平台游向四周相邻的任意一个平台&#xff0c…

python可以构建sem模型_python-分组的熊猫DataFrames:如何将scipy.stats.sem应用于它们?...

我知道我可以通过执行以下操作来应用numpy方法:dataList是DataFrames的列表(相同的列/行).testDF (concat(dataList, axis1, keysrange(len(dataList))).swaplevel(0, 1, axis1).sortlevel(axis1).groupby(level0, axis1))testDF.aggregate(numpy.mean)testDF.aggr…

java类中获取全局变量_java 通过反射获取类的全局变量、方法、构造方法

package com.str;public class ZiFuChuan {public static String ss "全局变量!!!!!!";String s2 null;public int aa 1 ;int aa2;double dou 1.1;Double d new Double(1.1);public static void main(String[] args) {}public ZiFuChuan(){}public ZiFuChuan(St…

java phantomjs 截图_phantomjs 截图

phantomjs 截图,多个setTimeout是为了让页面尽量加载完整/**截图test.js**/var page require(webpage).create();page.viewportSize { width: 1024, height: 600 };page.open(http://www.2345.com/, function(status) {var bb page.evaluate(function(){// window…

JAVA如何隐藏异常堆栈_java – 如何在控制台上停止打印异常堆栈跟踪?

这是我做的这样的战争作为工作。添加一个过滤器并劫持所有的请求和响应。检查异常并检查类型。/*** Hijacks all the http request and response here.* Catch the SocketException and do not print* If other exceptions print to console* date : 9-18-2013** author Suresh…

阿里最新php面试题及答案,面经网-阿里php面试题(四)

阿里php面试题(四)1.表单中 get与post提交方法的区别?答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.2.session与cookie的区别?答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_…

php 条形码生成器,PHP条形码图像生成器

这是一个用于生成barocdes的简单PHP脚本://For displaying barcodes//Arguments are:// code Number you want outputted as a barcode//You can use this script in two ways:// From a webpage/PHP script // Directly in your web browser http://www.example.co…

php怎么把日期加时间,将小时分钟添加到日期时间 - php

任何人都可以帮助我解决长时间困扰的问题,我正在尝试添加时间,例如格式为h:ia的小时和分钟,格式为01:00(一个小时),00:30(30分钟), 02:00(两个小时)等。在php中。因为我有几个小时,例如(00:30,01:00,01:30,…

php keep user login,php5.4安装dedecms登录后台空白解决办法(session_register函数已废弃)...

本地安装dedecms5.7登录后台空白,找了原因,原来是session_register函数已经被php5.4废弃的原因。-------------------------------------------------------------解决方法:找开include/userlogin.class.php文件,查找以下内容&…