理解:
当我们有一个类,他有多个派生类;该类中有一个对象,有多种实现方式。在该类中,我们需要使用该对象的方法,但实例化该对象是由不同的派生类确定的(象棋棋盘中是象棋对象,五子棋棋盘中是五子棋对象),因此,我们在父类中不能够进行初始化,只能够将其初始化延迟到子类当中。
实现方式是通过一个protected的createXXX()函数,让子类重写,以获得相应的实例化对象。
价值:
使得我们能够在不知道对象的具体形式的情况下,能够进行调用,可以在父类中封装一些流程。
否则,我们可能需要在父类中进行if-else 或者switch ,来进行对象的实例化。这样的话,父类必须要知道子类的信息,才能进行,使得耦合变大。
与抽象工厂对比:
抽象工厂,主要用于将对象从new的创建方式中脱离出来,使得对象的创建与使用分离开来,这样,对象要使用其他具体类进行实例化时,不会影响到使用对象的代码。
工厂模式,主要用于让类中的对象的实例化延迟到子类当中,以实现对象方法调用时的多肽效果。
因此,抽象工厂主要是提供外界使用的,让外接调用其创建对象的方法并隐藏其实现;而工厂方法主要是内部的实现方式,使用protected函数让子类重写创建对象的方法。用户可以知道是否使用了抽象工厂模式,而不会轻易知道是否使用了工厂模式。
因此,抽象工厂其名曰抽象,抽象往往是提供外界一个抽象类或者接口来定义其能够调用的方法,也意味着外界可以更清楚其方式了。
与模板方法对比:
模板方法中,也是在实现延迟到子类,使用protected的函数。但模板方法中,在父类中定义了函数调用方式、顺序,让子类来对其中的一些函数进行实现。
而工厂模式中,仅是将对象的创建延迟到子类中,同时他并没有相应的“模板”,因此,还是有一定的差别的。