一、简介
1.定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
2.结构图
Product:工厂方法所创建对象的接口,即实际使用对象的接口
ConcreteProduct:具体的Product接口的实现对象
Creator:申明工厂方法
ConcreteCreator:具体的创建器对象,覆盖实现Creator定义的工厂方法,返回具体的Product实例
二、Java实现
1.实例
public interface AudiProducer { public boolean produce(); }
public class A3AudiProducer implements AudiProducer { @Override public boolean produce() { System.out.println("Produce a car of 'Audi A3'"); return true; } }
public class Q5AudiProducer implements AudiProducer { @Override public boolean produce() { System.out.println("Produce a car of 'Audi Q5'"); return true; } }
public abstract class AudiCreator { protected abstract AudiProducer create(); public void produce() { AudiProducer producer = create(); producer.produce(); } }
public class A3AudiCreator extends AudiCreator { @Override protected AudiProducer create() { return new A3AudiProducer(); } }
public class FactoryMethodTest { public static void main(String[] args) { AudiCreator audiCreator = new A3AudiCreator(); audiCreator.produce(); } }
2.要点
- 抽象类AudiCreator并不知道create()方法的具体实现,只关心&完成自身功能的调用
- AudiCreator.create()具体的实现延迟到子类完成
- 工厂方法一般不提供给外部(本例中指AudiCreator以外)的类调用
protected AudiProducer create(String type) { if ("A4".equals(type)) { return new A4AudiProducer(); } else { return super.create(); } }
- 客户端(如FactoryMethodTest)应该使用AudiCreator或其创建出来的对象,一般不直接使用工厂方法
3.参数化工厂
工厂方法接受一个参数,根据参数判断生成什么对象,而子类重写时可以只处理自己关心的参数类型,而其他情况交给父类处理
改造后的工厂方法
public class AudiCreator { protected AudiProducer create(String type) { if ("A3".equals(type)) { return new A3AudiProducer(); } else if ("Q5".equals(type)) { return new Q5AudiProducer(); } else { return null; } } public void produce() { AudiProducer producer = create("A3"); producer.produce(); } }
如果我们又有一个新的A3AudiProducer需要创建,我们可以继承AudiCreator并重写方法create,提供A3AudiProducer的创建支持
protected AudiProducer create(String type) { if ("A4".equals(type)) { return new A4AudiProducer(); } else { return null; } }