• 工厂模式解耦-多例


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

    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

    1. package com.company.factory;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.util.Properties;
    5. /**
    6. * Bean对象实例化工厂
    7. * 1.读取配置文件
    8. * 2.获取类的全限定类名,利用反射实例化对象
    9. */
    10. public class BeanFactory {
    11. //定义一个Properties对象
    12. private static Properties prop;
    13. //使用静态代码块为Properties对象赋值
    14. static {
    15. try {
    16. //实例化对象
    17. prop=new Properties();
    18. //获取Properties文件的流对象
    19. InputStream inputStream=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
    20. //读取配置文件
    21. prop.load(inputStream);
    22. } catch (Exception e) {
    23. //有异常就抛出,还可以抛出自定义异常
    24. //throw new ExceptionInInitializerError("初始化properties失败!");
    25. e.printStackTrace();
    26. }
    27. }
    28. /**
    29. * 传入要实例化的对象名称
    30. * 获取类的全限定类名
    31. * 利用反射实例化对象
    32. */
    33. public static Object getBean(String beanName){
    34. //定义一个Object类型的bean并完成初始化
    35. Object bean = null;
    36. //根据要实例化的对象名称,获取类的全限定类名beanPath
    37. String beanPath = prop.getProperty(beanName);
    38. //利用反射实例化对象
    39. try {
    40. bean = Class.forName(beanPath).newInstance();
    41. } catch (Exception e) {
    42. e.printStackTrace();
    43. }
    44. return bean;
    45. }
    46. }

    在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();
            }
        }
    }
  • 相关阅读:
    【Vue3+Ts】—— webpack学习笔记(三)Plugin插件
    当我们做后仿时我们究竟在仿些什么(一)
    mysql数据库表关系,多表查询
    Hive数据库动态分区和静态分区插入区别
    #Z0045. S数
    设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码
    亚马逊频繁封号,跨境电商卖家如何应对?
    Flex & Bison 开始
    C#设计模式详解(2)——Factory Method(工厂方法)
    文件上传 [ACTF2020 新生赛]Upload1
  • 原文地址:https://blog.csdn.net/lee514/article/details/127990787