为什么工厂模式可以解耦?下篇

本文回顾了耦合的概念及其在传统EJB开发模式中的问题,指出Spring的流行源于其解决这些问题的理念。文章通过示例展示了如何从简单的Bean工厂演进为通用工厂,以提高代码的可重用性和可扩展性。通过配置文件,只需指定接口实现类,即可在运行时动态创建对象,增强了系统的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么工厂模式可以解耦?下篇

 

1、回顾(一)

上节我已经基本说明了耦合,以及在一些业务上是怎么发生的,实际上我们要理解一个思想,传统的EJB开发模式,因为受到了很多很多的框架硬性约束,web容器的约束

导致了代码的可读性,可移植和可扩展性变得不好,所以有这些解耦的思想,我们才会在03年spring的广泛流行!

回顾上节末尾:我们是不是遗留了一个问题,如果我们在工厂中,每次有一个新的对象,我们就需要手动的加一个对应的getBean方法,可重用性大大降低,所以我们称下面的代码,叫做

---------------------------简单工厂------------------------------------

/**

* 定义一个bean工厂,专门生产普通对象

*/

public class BeanFactory {

private static Properties properties = new Properties();

//1.加载配置文件

static {

InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");

try {

properties.load(resourceAsStream);

resourceAsStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

public static UserDao getBean(String key){

// 2.使用key获得value

String className = properties.getProperty(key);

// 3.使用value利用反射技术创建对象

try{

return (UserDao) Class.forName(className).newInstance();

}catch(Exception e){

e.printStackTrace();

return null;

}

}

}

那么为了避免多个不同的对象在实际生产业务中,代码的繁重,我们将这个简单工厂,改造成通用工厂

/**

* 定义一个bean工厂,专门生产普通对象

*/

public class BeanFactory {

private static Properties properties = new Properties();

//1.加载配置文件

static {

InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");

try {

properties.load(resourceAsStream);

resourceAsStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

// 来个对象就要在工厂创建一个

// public static UserDao getMysqlBean() {

// return new UserDaoMysqlImpl();

// }

//

// public static UserDao getOracleBean() {

// return new UserDaoOracleImpl();

// }

// 来个对象就要在工厂创建一个,冗余代码太多

// public static UserDao getBean(String key){

// // 2.使用key获得value

// String className = properties.getProperty(key);

// // 3.使用value利用反射技术创建对象

// try{

// return (UserDao) Class.forName(className).newInstance();

// }catch(Exception e){

// e.printStackTrace();

// return null;

// }

// }

/**

* 通用工厂方法,不必要一个新来对象就要创建一个getBean

* @param key

* @return

*/

public static Object getBean(String key){

Object ret = null;

String className = properties.getProperty(key);

// 3.使用value利用反射技术创建对象

try{

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

}catch(Exception e){

e.printStackTrace();

}

return ret;

}

}

这样的话,是不是我们只需要在配置文件中这么写:

userDao=com.chenxin.gmall.user.demo.dao.UserDaoSqlServerImpl

userService=com.chenxin.gmall.user.demo.service.UserServiceImpl

在需要创建对象的地方,我们只需要强制转换下:

UserDao userDao = (UserDao) BeanFactory.getBean("userDao");

......

我们想在哪里生成一个接口的实现类,只要你存在这个接口的实现,我们就可以定义在配置文件中,然后在你需要生成的地方调用即可!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值