zoukankan      html  css  js  c++  java
  • 工厂模式

      工厂模式相当于创建对象的new。如 A a = new A(). 工厂模式也是用来创建实例对象的,但它是面向接口编程,提高了代码的扩展性和维护性。像Hibernate 换数据库只需换方言和驱动就可以,这也是工厂模式的实现

    例:这两天加班太累了,想去按摩店按摩。每位技师都有不同的特长,我只需要告诉经理我要什么服务,她就能安排,我不需要管具体是哪位技师。

    //创建对象的接口
    public interface Massage {
      //需要按摩服务
      public void massagist();
    }
    
    class Massage1 implements Massage{
      @Override
      public void massagist() {
          System.out.println("7号技师为您泰式足底按摩90分钟");
      }
    }
    class Massage2 implements Massage{
      @Override
      public void massagist() {
          System.out.println("13号技师为您精油推背90分钟");
      }
    }
    class Massage3 implements Massage{
      @Override
      public void massagist() {
          System.out.println("27号技师为你前列腺按摩120分钟");
      }
    }

    工厂类

    public class MassageFactory {
         // 获取对象实例
         public static Massage getInstance(String massageName) {
             Massage massage = null;
             if(massageName.equals("Massage1")) {
                 massage = new Massage1();
             }
             if(massageName.equals("Massage2")) {
                 massage = new Massage2();
             }
             if(massageName.equals("Massage3")) {
                 massage = new Massage3();
             }
             return massage;
         }
         
         public static void main(String[] args) {
             Massage massage = MassageFactory.getInstance("Massage2");
             massage.massagist();
         }
    }
    ==============
    【控制台输出】
    13号技师为您精油推背90分钟

    可以发现普通工厂模式中,每当我们新增加一个子类的时候,就需要去修改工厂类里面的方法,这样的程序是不具有扩展性的。

    Java反射优化工厂类

    public class MassageReflexFactory {
        // 获取对象实例
        public static Massage getInstance(String massageName) {
            Massage massage = null;
            try {
                // 通过className反射动态获取class文件
                Class<?> classInfo = Class.forName(massageName);
                // 获取对象实例
                massage = (Massage)classInfo.newInstance();
            } catch (Exception e) {
                // TODO: handle exception
            }
            return massage;
        }
        public static void main(String[] args) {
             Massage massage = MassageFactory.getInstance("Massage1");
             massage.massagist();
        }
    }
    =================
    【控制台输出】
    7号技师为您泰式足底按摩90分钟

      对比可以发现,无论接口有多少个子类实现我们都不需要修改工厂类的方法,只需要传入类名称就能获取对象。反射机制通过动态创建对象进行反编译获取类的属性,使得代码更加灵活,更容易实现面向对象。

    spring中工厂模式的实现

    // 创建bean工厂
    public interface BeanFactory {  
        Object getBean(String id) throws ExecutionException;
    }
    
    // Bean工厂的实现类
    public class ClassPathXmlApplicationContext implements BeanFactory {
        
        private Map<String, Object> map = new HashMap<String, Object>();
        
        @SuppressWarnings("unchecked")
        public ClassPathXmlApplicationContext(String fileName) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException {
            
             //加载配置文件
             SAXReader reader = new SAXReader(); 
             Document document = reader.read(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(fileName));
             
             //获取根节点
             Element root = document.getRootElement(); 
             //获取子节点
             List<Element> childElements = root.elements();
             
             for (Element element : childElements) {
                 map.put(element.attributeValue("id"), Class.forName(element.attributeValue("class")).newInstance());
             }
        }
    
        @Override
        public Object getBean(String id) throws ExecutionException {
            return map.get(id);
        }
    }
  • 相关阅读:
    架构漫谈1
    如何将本地工程上传到github
    寒假日报day23
    寒假日报----首都之窗爬虫大作业
    寒假日报day22
    寒假日报day21
    关于webmagic的post请求
    寒假日报day20
    寒假日报day19
    吾日三省吾身(41)
  • 原文地址:https://www.cnblogs.com/wlwl/p/9478941.html
Copyright © 2011-2022 走看看