设计模式之工厂方法模式

定义

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

结构

  • 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)模式
研磨设计模式-书籍

posted @ 2021-08-10 10:01  strongmore  阅读(96)  评论(0编辑  收藏  举报