zoukankan      html  css  js  c++  java
  • 设计模式之工厂方法模式

    定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

    结构

    • ProductFactory,抽象产品工厂,声明了一个工厂方法,返回一个抽象的产品。
    • Product,抽象产品,工厂方法返回的接口类型。
    • ConcreteProductFactory,具体工厂,实现抽象工厂接口,工厂方法返回一个具体的产品。
    • ConcreteProduct,具体产品,抽象产品的实现,和具体工厂之间一一对应。

    简单实现

    抽象产品

    public interface Product {
    
      void show();
    }
    

    抽象工厂

    public interface ProductFactory {
    
      Product newProduct();
    }
    

    具体工厂和具体产品

    public class ConcreteProductFactory1 implements ProductFactory {
    
      @Override
      public Product newProduct() {
        return new ConcreteProduct1();
      }
    
      public static class ConcreteProduct1 implements Product {
    
        @Override
        public void show() {
          System.out.println("ConcreteProduct1 show");
        }
      }
    }
    

    第二个具体工厂实现

    public class ConcreteProductFactory2 implements ProductFactory {
    
      @Override
      public Product newProduct() {
        return new ConcreteProduct2();
      }
    
      public static class ConcreteProduct2 implements Product {
    
        @Override
        public void show() {
          System.out.println("ConcreteProduct2 show");
        }
      }
    }
    

    客户端

    public class Client {
    
      public static void main(String[] args) {
        ProductFactory productFactory = new ConcreteProductFactory1();
        Product product = productFactory.newProduct();
        product.show();
      }
    
    }
    

    每一种具体的工厂创建对应的具体的产品。

    工厂方法模式在JDK和SpringMVC中的实现

    JDK中实现

    JDK中 Iterable 和 Iterator 接口就是抽象工厂和抽象产品。ArrayList和LinkedList这些实现类就是具体工厂。

    /**
         * Returns an iterator over the elements in this list in proper sequence.
         *
         * <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
         *
         * @return an iterator over the elements in this list in proper sequence
         */
        public Iterator<E> iterator() {
            return new Itr();
        }
    
    /**
         * Returns an iterator over the elements in this list (in proper
         * sequence).<p>
         *
         * This implementation merely returns a list iterator over the list.
         *
         * @return an iterator over the elements in this list (in proper sequence)
         */
        public Iterator<E> iterator() {
            return listIterator();
        }
    

    创建的 Iterator 内部实现类就是具体产品。

    SpringMVC中实现

    SpringMVC中解析文件上传的处理类 MultipartResolver 和 MultipartHttpServletRequest 接口也是抽象工厂和抽象产品的角色。

    具体的文件上传解析器创建具体的请求。

    总结

    优点

    1. 扩展性好,系统中要加入新产品时,只需要增加新的具体产品工厂和具体产品,无需修改原有实现,符合开闭原则。

    缺点

    1. 增加新产品,需要增加具体产品工厂类和具体产品类,类的数量将成对增加,一定程度上增加了系统复杂度。

    本质

    工厂方法模式的本质就是延迟到子类来选择实现。简单工厂可以看做工厂方法只有一个工厂实现的特例。

    使用场景

    1. 一个类需要创建某个接口的对象,但不知道具体的实现,这种情况下可以使用工厂方法模式,将创建对象的工作延迟到子类中去实现。

    参考

    工厂方法(Factory Method)模式
    大战设计模式(第二季)【1】———— 从源码看工厂模式
    设计模式的征途—3.工厂方法(Factory Method)模式
    研磨设计模式-书籍

  • 相关阅读:
    (转)程序员应该知道的10个eclipse调试技巧
    Hibernate缓存
    【转】Hibernate 原汁原味的四种抓取策略
    hibernate 延迟加载和抓取策略
    移动端接口安全
    Thinkphp3.2.3中的RBAC权限验证
    单例模式--工厂模式
    php爬虫入门
    php爬虫入门
    .htaccess使用方法介绍
  • 原文地址:https://www.cnblogs.com/strongmore/p/15120588.html
Copyright © 2011-2022 走看看