工厂模式解耦-多例

工厂是干什么的?
在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来使用的时候,直接拿过来用就好了。
那么这个读取配置文件,创建和获取三层对象的类就是工厂。

Bean工厂是干什么用的?创建service和dao对象。

怎么创建对象的?
     第一步:需要一个配置文件来配置我们的service和dao
          配置的内容:唯一标识=全限定类名(key=value)
     第二步:通过读取配置文件中配置的内容,反射创建对象
          我们的配置文件可以是xml也可以是properties

初级版本(配置文件使用properties)
由于是maven工程,在resources文件中新建一个配置文件,名字就叫做bean.properties
配置的内容:唯一标识=全限定类名(key=value)
例如:
bean.properties的内容
accountService=com.company.service.impl.AccountServiceImpl
accountDao=com.company.dao.impl.AccountDaoImpl

package com.company.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Bean对象实例化工厂
 * 1.读取配置文件
 * 2.获取类的全限定类名,利用反射实例化对象
 */
public class BeanFactory {
    //定义一个Properties对象
    private static   Properties prop;
    //使用静态代码块为Properties对象赋值
    static {
        try {
            //实例化对象
            prop=new Properties();
            //获取Properties文件的流对象
            InputStream inputStream=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            //读取配置文件
            prop.load(inputStream);
        } catch (Exception e) {
            //有异常就抛出,还可以抛出自定义异常
            //throw new ExceptionInInitializerError("初始化properties失败!");
            e.printStackTrace();
        }
    }

    /**
     * 传入要实例化的对象名称
     * 获取类的全限定类名
     * 利用反射实例化对象
     */
    public static Object getBean(String beanName){
        //定义一个Object类型的bean并完成初始化
        Object bean = null;
        //根据要实例化的对象名称,获取类的全限定类名beanPath
        String beanPath = prop.getProperty(beanName);
        //利用反射实例化对象
        try {
            bean = Class.forName(beanPath).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }

}

在main函数中测试每次循环模拟一个线程都会产生一个accountService对象,即多例。

public class WebClient {
    public static void main(String[] args) {
        for (int i = 0; i <5 ; i++) {
            IAccountService accountService =(IAccountService) BeanFactory.getBean("accountServie");
            System.out.println(accountService);
            accountService.save();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值