回调——工厂方法模式

工厂方法

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

解读

之前一直觉得很拗口,看不懂。他实际上是这个意思,先定义一个基类,基类有一个成员属性,这个属性是某个对象。然后围绕这个对象有一系列操作和新建的接口,操作的接口实现写在基类中,但是新建的接口定义为抽象方法,由子类去实现。这就是 类的实例化 延迟到子类的意思。即其他操作我可以定义在基类中,但是创建属性的接口我一定是写在派生类中的。

适用场景

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定所创建的对象的时候。
  • 当类将创建对象的职责委托给多个子类中的某一个。

这些是设计模式书中的介绍,都很晦涩难懂哈我觉得我反正没看懂= =

思考

有点像回调方法有没有,将实际需要执行的方法委托给其他对象去做。回调方法是委托给低层对象,低层对象回传需要执行的方法,因为高层对象不知道具体要执行什么方法。(通俗的讲就是将方法作为参数传递,再通俗就是ajax的success:function(),ajax不知道拿到数据该怎么办,就由传进来的func去决定。)这里同样的,基类不知道如何去创建类,所以由它的派生类去决定。

类似的操作可以是将实例化延迟到子类,也可以是将某个操作延迟到子类吧,甚至任何意义上的基类无法确定的操作都可以延迟到子类

变体

如同单例也有饿汉饱汉一样,工厂方法也有一些变体

有默认实现

给工厂方法定义一个默认实现,子类可以覆盖他或不覆盖他

没有默认实现

不定义默认实现,子类必须实现该接口。

参数化

在基类的创建接口中定义一个参数用于指定生成不同的类,如果是1就生成A类,如果是2就生成B类。派生类需要复写创建方法,最后调用父类方法。

public class ShapeCreator{
    public Shape create(int type){
        switch(type){
            case 1:
                return new Circle();
                break;
            case 2:
                return new Rect();
                break;
            default:
                return new Triangle();
                break;
        }
    }
}

public class MyShapeCreator{
    public Shape create(int type){
        switch(type){
            case 1:
                return new Circle();
                break;
            case 2:
                return new Rect();
                break;
            default:
                return super.create(type);
                break;
        }
    }
}

因为子类只覆盖特定的几个生成,如果都不符合的话还是把创建的工作交给父类。

优缺点

如果用传统的实现方式,需要实例化的类型过多的话会出现类爆炸的问题。每添加一个子类型就要新建一个类

原则

感觉用了开闭原则,在不修改原有类(基类和其他扩展类)的情况下扩展。

点赞