java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度

一、什么是耦合

程序之间的依赖关系:

①类之间的依赖

②方法之间的依赖

注意:

不可能完全的消除依赖关系,而只能是降低程序之间的依赖关系

二、解耦

降低程序之间的依赖关系:

1.解决类之间的依赖关系:

①通过读取配置文件来获取要创建对象的全限定类名

②使用反射来创建类的对象,尽量避免new关键字的使用

三、问题引出

1.新建Maven项目

04ec5ea32767df3f0a216544928801eb.png

dcdec961f511eb36d37c1f3335780ebe.png

2.修改配置文件,添加如下代码,让程序打包成Jar包的形势

jar

8dfeedc19302dc6bb88a2bab5e43773b.png

3.开始编写实验代码,整体架构如下:

d6a5d96e622cd7c6cde51ebc96e6b371.png

3.持久层接口

package com.huhai.Dao;

/**

*持久层接口

*/

public interface IAccountDao {

public abstract void save();

}

4.持久层接口实现类

package com.huhai.Dao.Impl;

import com.huhai.Dao.IAccountDao;

/**

* 持久层实现类

*/

public class AccountDaoImpl implements IAccountDao {

public void save() {

System.out.println("数据保存成功");

}

}

5.业务层接口

package com.huhai.Service;

/**

*业务层接口

*/

public interface ISaveAccountService {

public abstract void save();

}

6.业务层接口实现类

package com.huhai.Service.Impl;

import com.huhai.Dao.Impl.AccountDaoImpl;

import com.huhai.Service.ISaveAccountService;

/**

* 业务层实现类

*/

public class AccountServiceImpl implements ISaveAccountService {

private AccountDaoImpl accountDao = new AccountDaoImpl();

public void save() {

accountDao.save();

}

}

7.表现层

package com.huhai;

import com.huhai.Service.Impl.AccountServiceImpl;

public class Realize {

private static AccountServiceImpl accountService;

public static void main(String[] args) {

accountService = new AccountServiceImpl();

accountService.save();

}

}

可以看出,它们之间的依赖关系非常严重,因此需要解耦

四、使用工厂模式降低程序耦合度

1.项目架构

dd6d43e85d8a950d63bb4d562f263ccb.png

2.工厂类:

package com.huhai.Factory;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

/**

* 一个创建Bean对象的工厂

* 它就是创建Server和Dao对象的

*/

public class BeanFactory {

/**

* 定义Properties对象

*/

private static Properties properties;

/**

* 使用静态代码段为properties赋值

*/

static {

/**

* 实例化对象

*/

properties = new Properties();

/**

* 获取properties流对象

* 最好不要直接new,因为传路径的时候,路径是一个容易出错的地方

* 因为配置文件在resources根目录下,所以可以直接填写文件名字bean.properties作为参数

* 使用类加载器来获得文件的路径

*/

InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");

try {

properties.load(in);

} catch (IOException e) {

/**

* 配置文件如果出错,则没有必要继续运行

* 抛出错误,终止整个程序

*/

throw new ExceptionInInitializerError("初始化异常");

}

}

/**

* 使用工厂模式创建对象

* 因为返回的对象不一定是一个类,所以返回值类型为Object或者泛型

* 根据bean的名称获取bean对象

*/

public static Object getBean(String beanName){

/**

* 初始化返回对象

*/

Object bean = null;

/**

* 根据传入的beanName参数获取properties中的对应类的全限定类名

*/

String beanPath = properties.getProperty(beanName);

try {

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

} catch (Exception e) {

e.printStackTrace();

}

return bean;

}

}

工厂类升级版——工厂类的单例模式

package com.huhai.Factory;

import java.io.InputStream;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Map;

import java.util.Properties;

/**

* 一个创建Bean对象的工厂

* 它就是创建Server和Dao对象的

*/

public class BeanFactory {

/**

* 定义Properties对象

*/

private static Properties properties;

/**

* 定义一个Map,使之能够存放已经实例化的对象

* 该Map即为容器

* 该容器的建造是为了完成工厂的类的单例模式

*/

private static Map beans;

/**

* 使用静态代码段为properties赋值

*/

static {

try {

/**

* 实例化对象

*/

properties = new Properties();

/**

* 获取properties流对象

* 最好不要直接new,因为传路径的时候,路径是一个容易出错的地方

* 因为配置文件在resources根目录下,所以可以直接填写文件名字bean.properties作为参数

* 使用类加载器来获得文件的路径

*/

InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");

properties.load(in);

/**

* 配置文件如果出错,则没有必要继续运行

* 抛出错误,终止整个程序

*/

/**

*

*/

beans = new HashMap();

Enumeration keys = properties.keys();

/**

* 遍历所有的keys

*/

while(keys.hasMoreElements()){

String key = keys.nextElement().toString();

//根据配置文件得到指定类的全限定类名

String property = properties.getProperty(key);

//使用反射实例化对象

Object obj = Class.forName(property).newInstance();

//将对象放进仓库

beans.put(key, obj);

}

}catch (Exception e){

throw new ExceptionInInitializerError("初始化properties失败!");

}

}

/**

* 使用工厂模式创建对象

* 因为返回的对象不一定是一个类,所以返回值类型为Object或者泛型

* 根据bean的名称获取bean对象

*/

public static Object getBean(String beanName){

//根据bean的名称获取bean单例对象

return beans.get(beanName);

}

}

3.持久层接口

package com.huhai.Dao;

/**

*持久层接口

*/

public interface IAccountDao {

public abstract void save();

}

4.持久层接口实现类

package com.huhai.Dao.Impl;

import com.huhai.Dao.IAccountDao;

/**

* 持久层实现类

*/

public class AccountDaoImpl implements IAccountDao {

public void save() {

System.out.println("数据保存成功");

}

}

5.业务层接口

package com.huhai.Service;

/**

*业务层接口

*/

public interface IAccountService {

public abstract void save();

}

6.业务层接口实现类

package com.huhai.Service.Impl;

import com.huhai.Dao.IAccountDao;

import com.huhai.Factory.BeanFactory;

import com.huhai.Service.IAccountService;

/**

* 业务层实现类

*/

public class AccountServiceImpl implements IAccountService {

/**

* 使用工厂模式创建对象,降低程序耦合度

*/

private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDaoImpl");

public void save() {

accountDao.save();

}

}

7.表现层

package com.huhai;

import com.huhai.Factory.BeanFactory;

import com.huhai.Service.IAccountService;

public class Realize {

public static void main(String[] args) {

/**

* 为了解耦,使用工厂模式创建对象

*/

IAccountService accountService = (IAccountService) BeanFactory.getBean("accountServiceImpl");

accountService.save();

System.out.println(accountService);

}

}

8.bean.properties配置文件

#键(key)用小写

accountServiceImpl=com.huhai.Service.Impl.AccountServiceImpl

accountDaoImpl=com.huhai.Dao.Impl.AccountDaoImpl

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

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

相关文章

Java 实现sha_Java实现SHA算法的方法详解

本文实例讲述了Java实现SHA算法的方法。分享给大家供大家参考,具体如下:一 简介安全散列算法固定长度摘要信息二 SHA算法SHA-1、SHA-2(SHA-224、SHA-256、SHA384、SHA-512)三 SHA算法实现package com.imooc.security.sha;import java.security.MessageDi…

jsp和java使用值_如何将表单的值从jsp发送到Java

我有一个包含30个不同字段的表格。将它们全部传递给控制器​​时,需要为每个属性都具有一个属性,以及一对getter,setter。我将使表单字段作为一个对象并将该对象发送到控制器。我正在使用以下代码 , 但有人建议从jsp调用java方法并…

linux mysql 脚本带参数_Linux下用SHELL脚本执行带输入输出参数的ORACLE存储过程并得到结果...

存储过程 myproc(in_num in number,out_num out number)sql脚本模板mysql.sql{var nret number;execute :nret : 0;--初始化call存储过程 myproc(in_num in number,out_num out number)sql脚本模板mysql.sql{var nret number;execute :nret : 0;--初始化call myproc(in_code,:n…

mysql 半同步 配置_Mysql 半同步复制配置

以下是配置和监控半同步复制:1. 半同步复制功能以plugin的方式接入MySQL,需要在主库与从库两端同时开启半同步的支持,具体配置如下:On the mastermysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;m…

java 窗口线程_Java 窗体与线程问题

展开全部主窗口线程不能阻塞,也就是说应该处于空闲状态。如果阻62616964757a686964616fe4b893e5b19e31333335333638塞,窗口将不能响应用户事件。程序应该类似于这样public class ServerFrame extends JFrame {public ServerFrame() {//设置其他窗口参数/…

MySQL自动建立集合自动分片_1.mongodb初步使用总结

mongoDB2.6使用总结一、准备工作下载java驱动包驱动包下载地址:http://www.doczj.com/doc/3305bc20960590c69ec376c0.html/artifact/org.mongodb/mongo-java-driver mongoDB下载:http://www.doczj.com/doc/3305bc20960590c69ec376c0.html/在线api&#x…

java response.write_@ResponseBody与response.getWriter .write()区别

responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走视图处理器,而是…

springcloud 创建子父项目_idea搭建springCloud----搭建父子项目(二)

今天介绍一下 : idea 搭建父子项目父项目:springCloud_ht子项目:eureka_server(注册中心)1-1.新建父项目:1-2 起名称 springCloud_ht1-3 什么都不选,next1-4 :起项目名称:springCloud_ht1-5: 该目录为下图,但是项目为红…

db2 mysql sql server_连接数据库的方法(Oracle DB2 SQL Server MySQL...)

[java]代码库import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;/*** 连接各类数据库的方法*/public class DBConnector {/*** 获得数据库连接** param driverClassName* 连接数据库用到的驱动类的类名* param dbURL* 数据库的URL* para…

格子里输出 java_蓝桥杯-格子中输出-java

/* (程序头部注释开始)* 程序的版权和版本声明部分* Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生* All rights reserved.* 文件名称: 蓝桥杯赛题* 作 者: 彭俊豪* 完成日期: 2016 年 04月 01日* 版 本 号: …

基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...

文件名称: RSA下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 169 KB上传时间: 2014-04-23下载次数: 0提 供 者: 姚双奇详细说明:rsa加密程序,rsa java源码和 rsa的jsp-rsa encryption program, rsa java source code and rsa in jsp文件列表(点击…

java jdbc is一个会话_java_JdbcUtilis_单实例

//eg1,没有使用单实例,eg2有package cn.itcast;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public final class JdbcUtils {private static String url "…

蝗虫算法java代码_蝗虫搜索算法 蝗虫算法:蝗虫优化算法是模拟自然界蝗虫种群捕食行为而提出的一 联合开发网 - pudn.com...

蝗虫搜索算法所属分类:其他开发工具:matlab文件大小:347KB下载次数:5上传日期:2020-07-26 16:31:25上 传 者:西柚不加冰说明: 蝗虫算法:蝗虫优化算法是模拟自然界蝗虫种群捕食行为而…

mysql 唯一约束 多字段_mysql多字段唯一约束

MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。在创建表时设置唯一约束在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法规则如下: UNIQUE创建数据表 t…

java中final是修饰符么_Java final修饰符详解

final 在 Java 中的意思是最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思。final 应用于类、方法和变量时意义是不同的,但本质是一样的,都表示不可改变。使用 final 关键字声明类、变量和方法需要注意以下…

java程序输出88的0 1矩阵_《剑指Offer》Java实现--顺时针打印矩阵

题目描述输入一个矩阵,按照从外向里顺时针的顺序打印出每一个数字。测试用例如下图:测试数组思路分析这道题目并不难,关键在于边界控制!每一层遍历均从左上角开始,逐层往里完成遍历。Java代码实现/*** 由外向内顺时针打…

java程序表头出不来_JAVA SWING 表头不显示问题

Cats萌萌说明: JScrollPane 也是组件, 你需要把滚动面板也添加到你的布局里.由于你的布局是绝对布局setLayout(null); 那么你还需要为JScrollPane 设置大小和位置效果图参考代码1234567891011121314151617181920212223import javax.swing.*; public class FrameDemo extends JF…

php红色字体颜色,php生成文字颜色渐变 高级用法

项目描述:因为要做打印的产品价格贴,需要美观度,产品名字需要颜色渐变。这里非常感谢ThinkPHP 峰会4 里面的大神们。 [厦门]伍拾步 [上海]beyond [江苏]囧NC 【浙江】幸福 泰安sunny有兴趣的可以加入哦 群号43321338效果图展示$txt"祝群…

php 依赖注入框架,依赖注入模式(Dependency Injection)

依赖注入模式(Dependency Injection)由 学院君 创建于5年前, 最后更新于 10个月前版本号 #318333 views16 likes0 collects1、模式定义依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。我们先来看看什么是控制反转。当调用者需要被调用者的协助…

php点加等于0,php 做数学运算时结果为0的原因

MSSQL—字符串分离(Split函数)前面提到了记录合并,有了合并需求肯定也会有分离需求,说到字符串分离,大家肯定会想到SPLIT函数,这个在.NET,Java和JS中都有函数,很可惜在SQL SERVER中没有,我们只能自己来写这么一个 ...更好的使用chromeCtrltab 在标…