设计模式学习笔记----工厂方法

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()

优点

  • 能隐藏创建类和被创建类之间的关系,使代码更简洁。
  • 能描述更复杂的组件关系。当组件和组件之间的关系时树甚至是网的时候,抽象工厂已经无法描述这种关系了,而工厂方法这种类似节点的方式能很好的描述各种关系。

缺点

  • 若被创建类并不需要创建类的任何信息,那任需要初始化一个创建类来创建被创建类。(这个也不能算缺点,毕竟这种情况本身就是应该避免的)

你可能感兴趣的:(设计模式学习笔记----工厂方法)