美文网首页
设计模式学习笔记----工厂方法

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

作者: ssochi | 来源:发表于2019-06-18 16:34 被阅读0次

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

    优点

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

    缺点

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

    相关文章

      网友评论

          本文标题:设计模式学习笔记----工厂方法

          本文链接:https://www.haomeiwen.com/subject/zzvfqctx.html