定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法时一个类的实例化延迟到其子类。
使用场景:
第一种情况,对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
第三种情况,客户端不需要知道对象的创建细节。
实现:一个抽象产品类,多个具体产品实现类,一个抽象工厂类,只有一个实例化产品类的方法,多个具体工厂实现类负责实例化不同的具体产品类。
优点:符合开闭原则,封装对象创建过程,使用继承和多态易扩展易维护。
代码示例:每个男人都有个豪车梦,但仅仅是个梦,我就不一样,我可以new一堆出来。利用工厂方法模式实现生产不同品牌的汽车
/**
* 抽象汽车类
* @author liuhao
*
*/
public abstract class Car {
/**
* 品牌
*/
protected String brand;
public Car(String brand) {
this.brand = brand;
}
//开车
public void run() {
System.out.println("开着我的"+brand+"上路啦!");
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
/**
* 汽车具体实现类-法拉利
* @author liuhao
*
*/
public class Ferrari extends Car {
public Ferrari(String brand) {
super(brand);
}
}
/**
* 汽车具体实现类-奔驰
* @author liuhao
*
*/
public class Mercedes extends Car {
public Mercedes(String brand) {
super(brand);
}
}
/**
* 汽车工厂抽象父类
* @author liuhao
*
*/
public abstract class CarFactory {
/**
* 提供生产汽车的方法
* @return 汽车实例
*/
public abstract Car produceCar();
}
/**
* 法拉利汽车工厂
* @author liuhao
*
*/
public class FerrariFactory extends CarFactory {
@Override
public Car produceCar() {
return new Ferrari("法拉利");
}
}
/**
* 奔驰汽车工厂
* @author liuhao
*
*/
public class MercedesFactory extends CarFactory {
@Override
public Car produceCar() {
return new Mercedes("大奔");
}
}
输出结果: