一、什么是耦合

程序之间的依赖关系:

①类之间的依赖

②方法之间的依赖

注意:

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

二、解耦

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

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

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

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

三、问题引出

1.新建Maven项目

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

jar

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

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.项目架构

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

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

  1. Spring框架系列之AOP思想

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.AOP概述 (1).什么是 AOP AOP 为 Aspect Oriented Progra ...

  2. java ee框架学那个_Java EE三在主流框架是什么?_学小易找答案

    [简答题]Tomcat如何设置ip地址? [简答题]课本P67实训联系(1)(2)(3) (附件包含程序截图和运行结果截图) [单选题]谈判的实质就是辩论. [单选题]在PowerPoint中制作演示 ...

  3. Java—实现 IOC 功能的简单 Spring 框架

    编写一个实现 IOC 功能的简单 Spring 框架,包含对象注册.对象管理.及暴 露给外部获取对象的功能,并编写测试程序.扩展注册器的方式,要求采用 XML 和 txt 文件. 源代码 packag ...

  4. Spring简化Java开发_java开发如何用spring简化?详细图解

    近些年,随着科学技术水平的不断进步与发展,各种高新技术的应用越来越广泛.这也吸引了越来越多的人去学习java等编程语言以更好地适应时代的发展.今天就来为大家介绍一些与java有关的知识.也就是java ...

  5. 【Spring】第三课 Spring框架搭建MVC三层架构

    概念 本文对Spring框架在项目的实际应用和搭建项目框架中的作用和应用的介绍. 1.搭建项目开发环境 本文连接的数据库是mydb,采用的表是account,银行账户信息的数据表,如果读者对该表的结构 ...

  6. 【Spring框架】编写第一个入门程序

    一. 概述: 1). Spring: Spring框架是由Rod Johnson组织和开发的一个分层的Java SE/EE full-stack(一站式)轻量级开源框架,它以IoC(Inversion ...

  7. 每天一点儿时间学习Spring框架系列—IOC(2)

    每天一点儿时间学习Spring框架--Ioc(2) 前篇简单入门了Spring的结构,这次就来开始讨论其中的控制反转的思想和自己的一些编写实例分享.(编写不一定能够完美的实现,建议大家了解其中的基本步 ...

  8. java 父类转子类_Java多态,对象转型,和简单工厂模式。希望对您有帮助!

    各位读者老爷们大家好鸭~图图又来了,今天我们要说一下"多态". 怎么理解这两个字呢?可以理解为同一个引用对象的不同表现形态,即将父类的引用指向子类的对象.这是比较官方的书面解释,大 ...

  9. 三十八,反射的应用:工厂模式

    2019独角兽企业重金招聘Python工程师标准>>> 1.通过反射调用类中的方法 示例: Person类: package com.ares.demo;interface Info ...

最新文章

  1. 中科大博士20万字正经论文:教你如何给女朋友送礼物
  2. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第3章-基于代数连通度估计的多智能体系统群集运动控制
  3. Bootstrap 学习笔记 之代码和表格 (3 day)
  4. 数据库开发——MySQL——pymysql模块
  5. Linux 命令之 tar 命令-打包和备份的归档工具(附压缩/解压工具)
  6. 领域应用 | 阿里发布藏经阁计划,打造 AI 落地最强知识引擎
  7. Vue.set()实现数据动态响应
  8. [z] Flare-兼容Memcached协议的分布式(key/value store)键值存储系统
  9. mac 电脑连接不上github_Mac版爱思助手【手机投屏直播】工具使用教程
  10. 为什么你应该在 OpenResty 项目中使用 lua-resty-core
  11. [原]gimp的python控制台以及python的PIL图像处理库
  12. java递归求和 1 n_Java递归求和1+2+3+...+n实例详解
  13. 五、应用程序与驱动程序交互(缓冲模式)
  14. oracle连接plsqldev
  15. 车牌号对应归属地及城市JSON带简码
  16. BAT解密:互联网技术发展之路(2)- 业务如何驱动技术发展
  17. collect2: error: ld returned 1 exit status(Linux下Gcc编译问题)
  18. 【雅思大作文考官范文】——第六篇: 'parenting course' essay
  19. C# 静态函数调用窗体控件
  20. 课堂秩序难管理?这个方法造福师生

热门文章

  1. Zookeeper实现Master选举(哨兵机制)
  2. day27 CRM delete action 嵌入CRM
  3. Logistic回归的牛顿法及DFP、BFGS拟牛顿法求解
  4. CTF中的EXP编写技巧 zio库的使用
  5. 使用wireshark抓取3G包
  6. PHP session的工作原理
  7. 操作系统学习笔记-2.1.1.进程的定义、组成、组织方式、特征
  8. 牛客19115 选择颜色
  9. Unity-游戏小地图实战(前述知识点回顾与运用)
  10. Leetcode--105. 从前序与中序遍历序列构造二叉树(Java)