学Spring前必学——工厂设计模式

设计模式:

1. 广义概念
面向对象设计中,解决特定问题的经典代码
2. 狭义概念
GOF4人帮定义的23种设计模式:工厂、适配器、装饰器、门面、代理、模板...

工厂设计模式:

1. 概念:通过工厂类,创建对象   
      Object ret = BeanFactory.getBean("key")
2. 好处:解耦合
   耦合:指定是代码间的强关联关系,一方的改变会影响到另一方
   问题:不利于代码维护
   简单:把接口的实现类,硬编码在程序中
        UserService userService = new UserServiceImpl();

简单的工厂设计:

public class BeanFactory {
    private static Properties env = new Properties();//创建properties集合(map形式)
//静态代码块来读取
    static{
        try {   //涉及io必定有异常
            //第一步 获得IO输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //第二步 文件内容 封装 Properties集合中 key = userService value = com.baizhixx.UserServiceImpl
            env.load(inputStream);

            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /*
        对象的创建方式:
           1. 直接调用构造方法 创建对象  UserService userService = new UserServiceImpl();
           2. 通过反射的形式 创建对象 解耦合
               Class clazz = Class.forName("com.baizhiedu.basic.UserServiceImpl");
               UserService userService = (UserService)clazz.newInstance();
     */
    public static UserService getUserService() {

        UserService userService = null;
        try {
                                         //com.baizhiedu.basic.UserServiceImpl
            Class clazz = Class.forName(env.getProperty("userService"));
            userService = (UserService) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return userService;

    }


    public static UserDAO getUserDAO(){

        UserDAO userDAO = null;
        try {
            Class clazz = Class.forName(env.getProperty("userDAO"));
            userDAO = (UserDAO) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return userDAO;

    }
}

简单工厂会有大量的代码冗余,所以可以用通用工厂来解决此问题

通用工厂设计

 创建一切想要的对象
 public class BeanFactory{
   //     修饰符   返回值类型 方法名 参数表
     public static  Object  getBean(String key){
          Object ret = null;
          try {
              Class clazz = Class.forName(env.getProperty(key));
              ret = clazz.newInstance();
          } catch (Exception e) {
             e.printStackTrace();
          }
          return ret;
      }
 
 }

通用工厂的使用方法

1. 定义类型 (类)
2. 通过配置文件的配置告知工厂(applicationContext.properties)
   key = value
3. 通过工厂获得类的对象
   Object ret = BeanFactory.getBean("key")

通用工厂的使用例子

//第一步:person类
public class Person{
    
}

//第二步:配置文件中
person = com.it.demo1.Person
    
//第三步,测试类中
    @test
    public void test(){
    Person person =(Person)BeanFactory.getBean("person");
}

Spring的本质:工厂 ApplicationContext (applicationContext.xml)

Spring为我们设计了更复杂更好用的工厂,上文我们自己设计的工厂是使用properties集合作为配置文件,spring使用xml文件作为配置文件。

上一篇:反射获取类属性和包


下一篇:java基础 - 反射 每天积极向上 --------END----------