FactoryMethod工厂方法
工厂方法指,一个业务上有实际用处的类(可能是抽象类),同时具备创建别的类的方法。可以理解为,这个类是一个工厂(若为抽象类则为抽象工厂),但它还具备实际的业务能力。使用工厂方法,一般是为了隐藏创建类和被创建类之间的引用关系,使程序看起来自然明了。
使用场景
- 当创建类与类之间有一定的引用或依赖关系时
- 想将创建的具体实现交给子类实现时
实现
假设我们有一个事件系统,有邮件事件,剧情事件,大世界事件,家族事件等等,当一个事件被事件管理器产生,将被抛到线程池当中,接着线程池处理这个事件,在事件结束时回调告诉事件管理器事件处理完成。
abstract class EventManager{
Event newEvent(){
Event e = createEvent();
if(e != null)
Event.setProcessor(this);
return e;
}
abstract Event createEvent();
abstract void onEventFinish(Event e);
}
abstract class Event{
EventManager local;
void setProcessor(EventManager mgr){
this.local = mgr;
}
abstract void deal();// deal with event, finally invoke #finish
void finish(){
processor.onEventFinish(this);
}
}
首先,每一个事件和事件管理器是一一对应的,并且在还未编写具体的时间管理器时,我们没法编写具体的事件。我们需要使用工厂方法,定义一个生成事件的虚方法,将具体的实现交给子类。
其次,每一个事件最后需要回调事件管理器,因此,事件需要持有一个事件管理器的引用。因为我们使用了工厂方法,事件管理器的引用自然而然的就给了事件。如果我们用抽象工厂来实现这个需求会怎么样?抽象工厂同时能生产事件管理器和事件,但由于事件和事件管理器互不可见,因此需要在生产事件的方法上加上事件管理器的引用了,这一步是必须的,但也将组件间的引用关系 展示给了用户,然而这时没必要的。
例子
- java.lang.Object#toString() (在其子类中可以覆盖该方法)
- java.lang.Class#newInstance()
优点
- 能隐藏创建类和被创建类之间的关系,使代码更简洁。
- 能描述更复杂的组件关系。当组件和组件之间的关系时树甚至是网的时候,抽象工厂已经无法描述这种关系了,而工厂方法这种类似节点的方式能很好的描述各种关系。
缺点
- 若被创建类并不需要创建类的任何信息,那任需要初始化一个创建类来创建被创建类。(这个也不能算缺点,毕竟这种情况本身就是应该避免的)
网友评论