精髓:定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而解决单个对象变化的问题。
代码:
Interface Car{
void run();
}
class MiniCar implements Car{
public void run(){
System.out.println("迷你小汽车开跑");
}
}
class BigTruck implements Car{
public void run(){
System.out.println("大卡车开跑");
}
}
//简单工厂方法模式
class CarFactory{
public static Car productCar(int param){
switch(param){
case 1:
return new MiniCar();
case 2:
return new BigTruck();
default:
throw new Exception("不能生产这种类型的车");
}
}
}
//工厂方法模式--将简单工厂模式中逻辑判断参数根据参数创建对象的代码变更为若干个类 代码如下
Interface CarFactory{
Car productCar();
}
public class MiniCarFactory{
public Car productCar(){
return new MiniCar();
}
}
public class BigTruckFactory{
public Car productCar(){
return new BigTruck();
}
}
//使用该模式的测试类--简单工厂模式
public class TestCar{
private CarFactory factory;
public CarFactory getCarFactory(){return this.factory;}
public void setCarFactory(CarFactory factory){this.factory=factory;}
public void test(){
}
}
//使用
public class Test{
public void main(String str[]){
//简单工厂模式
//Car miniCar=CarFactory.productCar(1);
//miniCar.run();
//Car bigTruck=CarFactory.productCar(2);
//bigTruck.run();
//工厂方法模式
Car miniCar=new MiniCarFactory().productCar();
miniCar.run();
Car bigTruck=new BigTruckFactory().productCar();
bigTruck.run();
}
}
对比:
简单工厂模式中工厂类类似于万能类,它知道他要创造的所有对象,每次增加不同的类时,需要修改判断逻辑。
工厂方法模式中每次增加新类时只需要增加实体类和工厂类,符合开闭原则。但要增加的实体类较多时或经常变化时则类的数量急剧增长。
工厂方法模式适用范围:
单个对象经常变化,实例化该对象的过程在使用时决定。主要是解决了扩展问题。