设计模式之工厂方法模式
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
结构
- 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 接口也是抽象工厂和抽象产品的角色。
具体的文件上传解析器创建具体的请求。
总结
优点
- 扩展性好,系统中要加入新产品时,只需要增加新的具体产品工厂和具体产品,无需修改原有实现,符合开闭原则。
缺点
- 增加新产品,需要增加具体产品工厂类和具体产品类,类的数量将成对增加,一定程度上增加了系统复杂度。
本质
工厂方法模式的本质就是延迟到子类来选择实现。简单工厂可以看做工厂方法只有一个工厂实现的特例。
使用场景
- 一个类需要创建某个接口的对象,但不知道具体的实现,这种情况下可以使用工厂方法模式,将创建对象的工作延迟到子类中去实现。
参考
工厂方法(Factory Method)模式
大战设计模式(第二季)【1】———— 从源码看工厂模式
设计模式的征途—3.工厂方法(Factory Method)模式
研磨设计模式-书籍