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构建数据立方体_OLAP数据建模工具Workbench的初步使用(数据立方体的建立)

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

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

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

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 . …

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…

java欧冠抽签,欧冠抽签吐槽:最大的“礼包”被C罗拿走!梅西出局概率超50%?...

欧冠16强抽签揭晓,结果:多特VS巴黎,皇马VS曼城,亚特兰大VS瓦伦西亚,马竞VS利物浦,切尔西VS拜仁,里昂VS尤文图斯,热刺VS莱比锡,那不勒斯VS巴萨。怎么评价这样的抽签呢&…

matlab 流固耦合,详讲流固耦合

引言近来,航空航天工业在世界上发展迅速,而作为“飞机心脏”的航空发动机是限制其发展的主要因素。目前,航空发动机日益向高负荷、高效率和高可靠性的趋势发展,高负荷导致的高逆压力梯度容易引起流动分离,同时随着科技…

php提示是否运行,php运行错误提示

第一种方法在php.ini文件里改变display_errors和error_reporting的值,没有的直接加上。; 第一处修改; display_errors Offdisplay_errors On; 第二处修改; error_reporting E_ALL & ~E_DEPRECATED & ~E_STRICTerror_reporting E_ALL | E_STRICTdisplay_…

usb转ttl模块与matlab,图文详解USB转TTL设备与电路板的连接

描述USB转TTL的硬件设备:USB转TTL主机一台;芯片选用PL-2303HXUSB转TTL刷机线,采用进口PL2303HX芯片。连接上电脑并安装驱动后,电脑即扩展出一个COM3或COM4....等的串口,配合相应软件就能对路由器、机顶盒或接收机等各种TTL接口的设备系统进行…

php乱码调试,NotePad++ 调试PHP代码中文显示乱码

最近在NotePad上调试PHP代码,按照示例代码进行调试,结果在显示中文的时候显示一堆乱码,于是上网百度,有2种方法可以解决:按调试方式有2种方法:1、菜单插件-NppExec:“插件”-“NppExec”-"Console Out…

php怎么设置网站的字符编码,php如何设置字符编码

php如何设置字符编码?a. 如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/html; charsetgb2312"),静态页面添加,所有文件的编码格式为ANSI,可用记事本打开,另存为选择编…

oracle em 删除 重建,Oracle 11g 重建EM需要删除的对象

因为需求需要重建EM,重建时因为某些错误被迫停止,比如对象已存在、用户已经存在等,最终找出了创建必备的条件;1.环境变量(Oracle和Grid在同一个用户下安装):ORACLE_HOME 要设为DB路径;ORACLE_UNQNAME 要设置;2.删除em相关的同义词:select drop public synonym ||syn…

oracle导出数据视频教程,Oracle导入导出数据的几种方式

oracle导入导出数据1.导出dmp格式文件--备份某几张表 !!!!exp smsc/smsc file/data/oracle_bak/dmp/bakup0209_2.dmp tables\(send_msg_his,send_msg,recv_msg_his,recv_msg\)--备份整个数据库 !!&#xff…

php ldap 模块,不重新编译为PHP增加LDAP模块的支持

不重新编译为PHP增加LDAP模块的支持2018-11-28安装步骤1、进入到php安装源码目录rootvm-199:~/lnmp0.9# cd php-5.3.28rootvm-199:~/lnmp0.9/php-5.3.28# cd ext/ldap/rootvm-199:~/lnmp0.9/php-5.3.28/ext/ldap# lltotal 136drwxr-xr-x 3 501 staff 4096 2014-08-06 17:17 ./d…

linux qemu运行windows,用qemu搭建CentOS 6 for colinux虚拟系统——《Windows下搭建CentOS 6开发环境之一》...

用qemu搭建CentOS 6 for colinux虚拟系统一、安装的软硬件环境操作系统: Windows XP SP3硬件环境: CPU AMD 速龙AthlonII X3 445 (3.1GHz/AM3/3*512KB二缓/45纳米)内存 Corsair 海盗船 CMX4GX3M2A1600C9 DDR3 1600 4G(2G*2)硬盘 Seagate 希捷 ST3100052…

linux下c语言编程gedit,Ubuntu Linux下实现Gedit支持NesC语法高亮

在TinyOS下主要采用nesC编程,一种C语言的近亲。平时默认打开文本的工具是gedit,将以下代码保存为nesc.langtext/x-nc*.nc;*C.nc;*M.nc;*P.nc->///**/falsenewthistrueusingtaskpostnamespaceeventcommandmoduleimplementationconfigurationtypenamete…

C语言优先队列作用,C语言实现优先队列(priority queue)

堆排序是一个比较优秀的算法,堆这种数据结构在现实生活中有很多的应用,比如堆可以作为一个优先队列来使用,作为一个高效的优先队列,它与堆的结构一样,都有最大优先队列,最小优先队列.优先队列priority queue 是一种用来维护一组元素构成的集合S的数据结构,每一个元素…

android 自定义progressbar demo,Android 自定义进度条ColorfulProgressbar,原理简单、效果还行...

效果图:demo效果演示演示Demo特性与原生Progress相比,感觉更漂亮一点,可以显示进度值,背景凹凸感明显,进度条效果更加立体。原理说明额,挺简单的。不过感觉我的做法有点复杂了,我先自定义了一个…

android os自动安裝软件,[图]Bliss OS 12进入开发阶段:可在桌面设备上安装Android 10系统...

此外还对电池进行了优化,添加了额外的安全性选项和相关功能,支持大部分主流游戏手柄,兼容ARM / ARM64应用程序。目前Bliss OS 12已经进入早期开发阶段,有望让您在PC上运行最新的Android 10移动操作系统。Bliss OS开发人员说&#…