工厂方法模式的本质:延迟到子类来选择实现
package com;
public interface Api {
void opreation(String s);
}
package com.impl;
import com.Api;
public class ImplA implements Api {
@Override
public void opreation(String s) {
System.out.println("我是A的实现:" + s);
}
}
package com.impl;
import com.Api;
public class ImplB implements Api {
@Override
public void opreation(String s) {
System.out.println("我是B的实现:" + s);
}
}
import com.Api;
public abstract class AbstractFactory {
public void opreation(String s){
Api api = factoryMethed();
api.opreation(s);
}
protected abstract Api factoryMethed();
}
import com.Api;
import com.impl.ImplA;
public class FactoryA extends AbstractFactory{
protected Api factoryMethed(){
return new ImplA();
}
}
import com.Api;
import com.impl.ImplB;
public class FactoryB extends AbstractFactory{
protected Api factoryMethed(){
return new ImplB();
}
}
public class Client {
public static void main(String[] args){
AbstractFactory fA = new FactoryA();
fA.opreation("SHIXIN");
AbstractFactory fB = new FactoryB();
fB.opreation("AXUE");
}
}
从本质上讲,它们确实是非常类似的,在具体的实现上都是“选择实现”。但是也存在不同点,简单工厂是直接在工厂类里面进行“选择实现”;而工厂方法会把这个工作延迟大盘子类来实现,工厂类里面使用工厂方法的地方是依赖于抽象而不是具体的实现,从而使得系统更加灵活,具有更好的维护性和可扩展性。
从某个角度来讲,可以认为简单工厂就是工厂方法模式的一种特例,因此它们的本质是类似的,也就不足为奇了。
建议在以下情况中选用工厂方法模式:
1 如果一个类需要创建某个接口的对象,但是又不知道具体的实现,这种情况下可以选用工厂方法模式,把创建对象的工作延迟到子类去实现。
2 如果一个类本身就希望由他的子类来创建所需要的对象的时候,应该使用工厂方法模式。