Spring5引言 工厂模式(一)

81 阅读2分钟

1.什么是spring?

 Spring是一个轻量级的JavaEE解决方案,整合众多的优秀的设计模式
  • 轻量级

     1. 对于运行环境没有额外的要求
     开源 tomcat resion jetty
     收费 weblogic websphere
     ​
     2. 代码移植性高
     不需要实现额外接口
    
  • JavaEE解决方案

  • 设计模式

     1. 工厂
     2. 代理
     3. 模板
     4. 策略
    

2. 设计模式

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

3. 工厂设计模式

工厂类+反射+配置文件

4.1 什么是工厂设计模式?

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

4.2 简单工厂的设计

 package com.fadedos.basic;
 ​
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 ​
 /**
  * @Description:TODO
  * @author: pengcheng
  */
 public class BeanFactory {
 ​
     private static Properties env = new Properties();
 ​
     static {
         try {
             //第一步 获得Io流
             InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
             //第二步 文件内容 封装 Properties集合中 key = userservice  value = com.fadedos.basic.UserService
             env.load(inputStream);
 ​
             inputStream.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 ​
     /*
     对象的创建方式:
         1.直接调用构造方法 创建对象  UserServiceImpl userServiceImpl = new UserServiceImpl();
         2.通过反射的方式 创建对象 解耦合
             Class clazz = Class.forName("com.fadedos.basic.UserServiceImpl");
             Userservice userservice = clazz.newInstance();
      */
     public static UserService getUserService() {
 ​
         UserService userService = null;
         try {
 //            Class<?> aClass = Class.forName("com.fadedos.basic.UserServiceImpl");
             Class<?> aClass = Class.forName(env.getProperty("userService"));
             userService = (UserService) aClass.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<?> aClass = Class.forName(env.getProperty("userDao"));
             userDao = (UserDao) aClass.newInstance();
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         } catch (InstantiationException e) {
             e.printStackTrace();
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         }
         return userDao;
     }
 }
 ​

4.3 通用的工厂设计

  • 问题

     简单工厂存在大量的代码冗余
    
  • 通用工厂的代码

         /**
          * @param key 小配置文件中的key [userService userDao]
          * @return
          */
         public static Object getBean(String key) {
             Object ret = null;
             try {
                 Class aClass = Class.forName(env.getProperty(key));
                 ret = aClass.newInstance();
             } catch (Exception e) {
                 e.printStackTrace();
             }
             return ret;
         }
    

    4.4 通用工厂的使用方式

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

    5. 总结

     Spring本质:工厂 ApplicationContext (配置文件 applicationContext.xml)