工厂方法模式较简单工厂模式,最大的改进就在于,工厂类被抽象出来。具体的工厂子类负责具体的产品创建,再也不是一个工厂类集万千责职于一身了。这样一来,工厂方法模式就涉及以下四个角色:
- 抽象工厂:这个角色仍然是工厂方法模式的核心,只是它再也应用无太大关系。
- 具体工厂:抽象工厂的实现类,与应用有着密切的联系
- 抽象产品:产品的接品的定义,在工厂方法模式中,产品可能存在多层的继续关系,因为可能存在多层的抽象产品。
- 具体产品:具体工厂要创建的对象
反映到代码中如下:
package com.pattern.factory.method;
public interface Product {
}
package com.pattern.factory.method;
public class ConcreteProduct1 implements Product {
}
package com.pattern.factory.method;
public class ConcreteProduct2 implements Product {
}
package com.pattern.factory.method;
public interface Creator {
public Product factory();
}
package com.pattern.factory.method; public class ConcreteCrector1 implements Creator { @Override public Product factory() { return new ConcreteProduct1(); } }
package com.pattern.factory.method; public class ConcreteCrector2 implements Creator { @Override public Product factory() { return new ConcreteProduct2(); } }
package com.pattern.factory.method; public class Client { private static Creator creator1,creator2; private static Product prod1,prod2; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub creator1 = new ConcreteCrector1(); creator2 = new ConcreteCrector2(); prod1 = creator1.factory(); prod2 = creator2.factory(); } }
那么想更好的体会,可以把上一章中简单工厂模式中的农场的例子,用工厂方法模式来改进,这时会发现,增加水果时不再需要更改原有的代码。只需要新增具体产品,新增工厂则可。那么从这个意义来说:工厂方法模式是完全支持开--闭模式的。
那么在JDK中,那个地方用到这个模式列?如书中提到的List接口:
List接口中定义了一iterator()方法,规定要返回一个Iterator对象,而具体的List实现类,则实现了该方法,关返回相关的对象。 在这个例子中,List扮演了抽象工厂方法类,具体的子类扮演具体的实现工厂,而Iterator扮演的是抽象产品,而具体的Iterator子类,则是具体产品。这就是这个模式的很好应用。
那么我们似乎可以总结出这么一个特点: 一个接口的有一个返回另一个抽象(接口或抽象类)的方法的这种特征,都可以规纳到工厂方法模式中来。切不可以将产品笼统的定义为简单的Pojo对象,他有可能是一个包含了自己行为的JavaBean