前言
今天来介绍创建型模式之工厂方法(Factory Method)。
其他创建型模式:
1. 意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
2. 适用性
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望哪一个帮助子类是代理者这一信息局部化的时候。
3. 参与者
- Product ——定义工厂方法所创建的对象的接口。
- ConcreteProduct ——实现Product接口。
-
Creator
——声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
——可以调用工厂方法以创建一个Product对象。 - ConcreteCreator ——重定义工厂方法以返回一个ConcreteProduct实例。
4. 效果
优点:
1). 为子类提供挂钩(hook)用工厂方法在一个雷的内部创建对象通常比直接创建对象更灵活。
2).连接平行的类层次。
3). 允许对操作和表示的精华 Singleton类可以有子类,而且用这个扩展类的实例配置一个应用是很容易的。
5. 实例
我们还是以汽车为Product来进行举例:
抽象产品类和具体产品类:
- ICar.java
- AudiCar.java
- BmwCar.java
public interface ICar {
void run();
}
public class AudiCar implements ICar {
@Override
public void run() {
System.out.println("驾驶奥迪汽车");
}
}
public class BmwCar implements ICar {
@Override
public void run() {
System.out.println("驾驶宝马汽车");
}
}
抽象工厂类和具体工厂类
- ICarFactory.java
- AudiCarFactory.java
- BmwCarFactory.java
public interface ICarFactory {
ICar getCar();
}
public class AudiCarFactory implements ICarFactory {
@Override
public ICar getCar() {
return new AudiCar();
}
}
public class BmwCarFactory implements ICarFactory {
@Override
public ICar getCar() {
return new BmwCar();
}
}
运行一下实例:
ICarFactory iAudiCarFactory= new AudiCarFactory();
iAudiCarFactory.getCar().run();
ICarFactory iBmwCarFactory= new BmwCarFactory();
iBmwCarFactory.getCar().run();
得到运行结果如下图所示:
6. 总结
- 工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
- 工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。
- 工厂方法通常在Template Methods中被调用。