1、工厂模式定义
定义一个创建对象的接口,让子类决定实例化哪个类,工厂方法模式使一个类的实例化延迟到其子类。
2、工厂包含以下角色
-
ICarFactory:抽象汽车工厂
定义生产汽车的方法,具体汽车工厂类的要实现的接口或继承的父类 -
PorscheFactory:抽象汽车工厂的子类——保时捷汽车工厂
负责生产保时捷汽车。 -
FerrariFactory:抽象汽车工厂的子类——法拉利汽车工厂
负责生产法拉利汽车。 -
ICar:抽象汽车产品
抽象汽车产品是所有汽车的父类,负责描述所有汽车的属性和行为 -
Porsche:保时捷汽车
保时捷工厂生产的保时捷汽车。 -
Ferrari:法拉利汽车
法拉利工厂生产的法拉利汽车。
3、工厂模式用UML类图表示
4、工厂模式用代码表示
- 抽象汽车接口
/**
* 抽象汽车接口
*/
public interface ICar {
void run();
}
- 具体汽车产品
- 保时捷
/**
* 保时捷
*/
public class Porsche implements Car {
@Override
public void run() {
System.out.println("Porsche running ...");
}
}
- 法拉利
public class Ferrari implements Car {
@Override
public void run() {
System.out.println("Ferrari running ...");
}
}
- 抽象车辆工厂
/**
* 抽象车辆工厂
*
*/
public interface ICarFactory {
/**
* 获取汽车
* @return
*/
ICar getCar();
}
- 具体车辆工厂
- 法拉利汽车工厂
/**
* 法拉利汽车工厂
*
*/
public class FerrariFactory implements ICarFactory {
/**
* 获取法拉利汽车
*
* @return
*/
@Override
public ICar getCar() {
return new Ferrari();
}
}
- 保时捷汽车工厂
/**
* 保时捷汽车工厂
*
*/
public class PorscheFactory implements ICarFactory {
/**
* 获取保时捷汽车
*
* @return
*/
@Override
public ICar getCar() {
return new Porsche();
}
}
- 收到客户订单,开始生产
/**
* 工厂方法模式
*
*/
public class FactoryMethodPattern {
public static void main(String[] args) {
// 创建法拉利汽车工厂
ICarFactory ferrariFactory = new FerrariFactory();
// 生产法拉利汽车
ICar ferrari = ferrariFactory.getCar();
// 驾驶法拉利汽车
ferrari.run();
// 创建保时捷汽车工厂
ICarFactory porscheFactory = new PorscheFactory();
// 生产保时捷汽车
ICar porsche = porscheFactory.getCar();
// 驾驶保时捷汽车
porsche.run();
System.out.println("Happiness is so simple");
}
}
- 执行结果:
5、工厂模式优缺点
优点:
-
解耦
通过工厂模式方法,将对象的创建延迟到其子类,使用者不需要关心具体的实现细节。 -
易扩展
增加新的产品时,只需要新增产品和具体的工厂对象;对其他工厂与产品无影响
缺点:
- 耦合
- 具体产品和具体工厂方法的耦合度高*
- 扩展繁琐
- 扩展新的产品时,需要增加新的产品对象和相应的具体工厂
6、何时选用工厂模式
- 一个类创建对象时,不用关心产品的具体实现细节,由它的子类创建所需要的对象,应该使用工厂方法模式。
7、工厂模式的应用
- 在spring中应用BeanFactory
mark,欢迎评论交流