单例和工厂设计模式入门小案例
程序员文章站
2022-06-09 14:04:16
...
案例背景:
当我们使用mvc模式开发的时候,在数据访问层(dao层),当dao的接口有多个实现的时候,如果service层调用的时候,这时候我们要去修改service层的代码来达到调用不同的dao实现类。为了尽量的不修改代码,就能达到上述目的,我们这个时候就可以将dao的实现交给一个工厂来完成,最终达到切换dao的实现,不需要修改任何代码的目的,下面的代码小案例就是这个思想的具体实现,欢迎查看!
通过这个小案例的学习,其实Spring的底层就是这样对三层架构之间进行解耦的,spring主要是写配置文件。
package cn.itcast.util;
/**
* 创建dao具体实例的工厂
* @author liuxiaoju
*
*/
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import cn.itcast.dao.UserDao;
public class DaoFactory {
/* 为了解决在service调用时,如果dao的实例变化了
* 还需要修改service层调用的代码,为了更好的解耦
* service层和dao层,我们需要设计这个工厂类来完成解耦的关系
* */
//采用单例模式,让这个对象只在内存中存在一个,至于类该怎么描述就怎么描述,想使用单例的话,加上下面注释的1,2,3内容即可!
//1,在类自己的内部创建本类对象
private static DaoFactory instance=new DaoFactory();
//2,将构造函数私有化,为的是不让除本类以外new对象
private DaoFactory() {}
//3,提供一个静态的方法给外部调用
public static DaoFactory getInstance() {
return instance;
}
//从配置文件中读取dao实现类的字符串
private static String daoImplClassName;
static {
try {
InputStream in=DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");
Properties properties=new Properties();
properties.load(in);
daoImplClassName=properties.getProperty("userDao");
} catch (IOException e) {
throw new RuntimeException();
}
}
public UserDao getUserDao() {
try {
return (UserDao)Class.forName(daoImplClassName).newInstance();
} catch (Exception e) {
throw new RuntimeException();
}
}
}