工厂方法模式(FactoryMethod )是创建型模式之一,
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
类图
public interface Vehicle {
/**
* 启动
*/
public void star();
/**
* 跑
*/
public void run();
/**
* 停止
*/
public void stop();
}
/**
* 子类产品(公交车)
* @author 林道银
*
*/
public class Bus implements Vehicle {
/**
* 启动
*/
@Override
public void star() {
// TODO Auto-generated method stub
System.out.println("公交车启动了!");
}
/**
* 跑起来
*/
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("公交车跑起来了!");
}
/**
* 停下来
*/
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("公交车停下来了!");
}
}
/**
* 子类产品(轿车)
* @author 林道银
*
*/
public class Car implements Vehicle {
@Override
public void star() {
// TODO Auto-generated method stub
System.out.println("小轿车启动了!");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("小轿车跑起来了!");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("小轿车停下来了!");
}
}
/**
* 工厂方法类
* @author 林道银
*
*/
public interface VehicleFactory {
/**
* 实例化子类产品
* @return
*/
public Vehicle createVehicle();
}
/**
* 生产轿车的工厂
* @author 林道银
*
*/
public class CarFactory implements VehicleFactory {
/**
* 实例化子类工厂(轿车)
*/
@Override
public Vehicle createVehicle() {
// TODO Auto-generated method stub
return new Car();
}
}
/**
* 生产公交车的工厂类
* @author 林道银
*
*/
public class BusFctory implements VehicleFactory {
/**
* 实例化子类工厂(公交车)
*/
@Override
public Vehicle createVehicle() {
// TODO Auto-generated method stub
return new Bus();
}
}
public class Test {
public static void main(String[] args) {
VehicleFactory vehicle=new CarFactory();
vehicle.createVehicle().star();
vehicle.createVehicle().run();
vehicle.createVehicle().stop();
}
}
工厂方法模式实现时,客户端需要决定实例化那一个工厂来实现汽车类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行.你想要加功能,本来是改工厂类的,而现在是修改客户端(如果想避免修改客户端代码可以利用'反射')
工厂方法模式是简单工厂模式的进一步抽象和推广.由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点但缺点是由于每加一个产品,就需要加一个产品工厂类,增加了额外的开发量.
工厂方法模式的应用
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。