问问自己它们是什么,为什么我们要它们。它们都在那里创建对象的实例。
ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside
到目前为止没有差异。现在,假设我们有各种学校类型,我们想从使用ElementarySchool切换到HighSchool(后者是从ElementarySchool派生的,或实现与ElementarySchool相同的接口ISchool)。代码更改为:
HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside
如果是接口,我们将:
ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside
现在,如果您在多个地方都有此代码,则可以看到使用factory方法可能非常便宜,因为一旦更改了factory方法,就可以完成操作(如果我们将第二个示例与接口一起使用)。
这是主要的区别和优势。当您开始处理复杂的类层次结构并且想要从这样的层次结构动态创建类的实例时,您将获得以下代码。然后,工厂方法可以使用一个参数,该参数告诉方法要实例化的具体实例。假设您有一个MyStudent类,并且需要实例化相应的ISchool对象,以便您的学生是该学校的成员。
ISchool school = SchoolFactory.ConstructForStudent(myStudent);
现在,您的应用程序中有了一个地方,其中包含确定要为不同的IStudent对象实例化的ISchool对象的业务逻辑。
所以-对于简单的类(值对象等),构造函数就可以了(您不想对应用程序进行过度设计),但是对于复杂的类层次结构,工厂方法是首选的方法。
这样,您将遵循四本书《程序到接口,而不是实现》一书中的第一个设计原则。