欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例和工厂设计模式入门小案例

程序员文章站 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();
        }

    }
}
相关标签: java入门小案例