Factory Method模式
工厂方法模式介绍:
工厂方法模式又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性。
工厂模式使用场景:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节。
工厂方法和简单工厂区别:
1.简单工厂通过方法传入的参数来判断并根据参数值实例化具体的操作类。
2.工厂方法通过定义抽象工厂,实现具体工厂类,返回具体产品父类接口或抽象类的方式来调用生成需要的类。
工厂方法结构图:
引入问题:
造车工厂会造拖拉机,汽车,火车,在一个工厂里明显不能完成,在现实世界中,一定是有自己独立的工厂来做。因为我们知道拖拉机,汽车,火车有很多共性也有很大差异,共性还是车,肯定都是重工生产,需要钢材,车床加工,都需要动力,都有座椅,车灯等等,那差异就多了,动力不同,火车可能是电动力,汽车是汽油,拖拉机是柴油等等。
代码设计:
/**
* 抽象工厂造车
*/
public interface CarsFactory
{
/**
* 造车
*/
public Cars create();
}
/**
* 汽车工厂-具体工厂
*/
public class CarFactory implements CarsFactory
{
@Override
public Cars create()
{
return new Car();
}
}
/**
* 拖货机工厂-具体工厂
*/
public class TractorFactory implements CarsFactory
{
@Override
public Cars create()
{
return new Tractor();
}
}
/**
* 火车工厂-具体工厂
*/
public class TrainFactory implements CarsFactory
{
@Override
public Cars create()
{
return new Train();
}
}
/**
* 抽象产品车
*/
public interface Cars
{
/**
* 运输
*/
public void transport();
}
/**
* 汽车实现类-具体产品
*/
public class Car implements Cars
{
@Override
public void transport()
{
System.out.println("Do Cars Car");
}
}
/**
* 拖拉机实现类-具体产品
*/
public class Tractor implements Cars
{
@Override
public void transport()
{
System.out.println("Do Cars Tractor");
}
}
/**
* 火车实现类-具体产品
*/
public class Train implements Cars
{
@Override
public void transport()
{
System.out.println("Do Cars Train");
}
}
public static void main(String[] args)
{
Cars cars = null;
/** 实例化汽车工厂,并开始造车*/
cars = new CarFactory().create();
cars.transport();
/** 实例化火车工厂,并开始造车*/
cars = new TrainFactory().create();
cars.transport();
/** 实例化拖拉机工厂,并开始造车*/
cars = new TractorFactory().create();
cars.transport();
}