工厂方法【factory method】
-
什么是工厂方法
定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的
实例化延迟到其子类。别名政策(Virtual Constructor) -
什么场景会用到工厂方法
工厂方法模式能够封装具体类型的实例化,在抽象的factory中,任何其他实现的方法,都可能使用到这个工厂方法所制造出来的产品,但只有子类真正实现这个工厂方法并创建产品。通俗一点就是,工厂方法让子类决定要实例化的类是哪一个。但是不要错误理解,所谓的‘决定’,并不是指模式允许子类本身在运行时做决定,而是在编写创建者类的时候,不需要知道实际创建的产品是哪一个。选择了使用哪个子类,自然就决定了实际创建的产品是哪一个
public abstract class Car {
protected String brand;
protected Car(String brand) {
this.brand = brand;
}
protected void create(){
System.out.println(brand + " is created.");
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
public class Havel extends Car {
public Havel(String brand) {
super(brand);
}
}
public class Audi extends Car {
public Audi(String brand) {
super(brand);
}
}
public interface CarFactory {
Car createNew();
}
public class HavelFactory implements CarFactory{
@Override
public Car createNew() {
return new Havel("havel");
}
}
public class AutiFactory implements CarFactory {
@Override
public Car createNew() {
return new Audi("audi");
}
}
public class AbstractMethodTest {
public static void main(String[] args) {
CarFactory factory = new AutiFactory();
Car car = factory.createNew();
car.create();
}
}
- 适用性
• 当一个类不知道它所必须创建的对象的类的时候。
• 当一个类希望由它的子类来指定它所创建的对象的时候。
• 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类
是代理者这一信息局部化的时候
相关参考:
<大话设计模式>,<设计模式,可复用面向对象软件的基础>,<Head First 设计模式>
源码在此