一、简介
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;
}
}