在对类建模时,首选的初始化方式是什么:
工厂构造函数,或
使用这两种方法的考虑因素是什么?
在某些情况下,我更喜欢有一个工厂方法,如果对象不能构造,它会返回null。这使得代码很整洁。在采取替代操作之前,我可以简单地检查返回值是否不为null,而不是从构造函数抛出异常。(我个人不喜欢例外)
比方说,我在一个类上有一个构造函数,它需要一个id值。构造函数使用此值填充数据库中的类。如果不存在具有指定id的记录,则构造函数将抛出RecordNotFoundException。在这种情况下,我必须将所有此类类的构造封装在一个try..catch块中。
相反,我可以在那些类上有一个静态工厂方法,如果没有找到记录,它将返回null。
在这种情况下,构造函数和工厂方法哪种更好?
发布于 2009-03-10 04:43:27
在以下情况下使用Factory Method模式
发布于 2009-03-10 05:18:29
问问你自己,它们是什么,为什么我们要有它们。它们都是用来创建对象实例的。
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
现在,如果你在多个地方都有这段代码,你会发现使用工厂方法可能非常便宜,因为一旦你改变了工厂方法,你就完成了(如果我们使用第二个接口的例子)。
这就是它的主要区别和优势。当您开始处理复杂的类层次结构,并且想要从这样的层次结构动态创建一个类的实例时,您会得到以下代码。然后工厂方法可能会接受一个参数,该参数告诉该方法实例化哪个具体实例。假设您有一个MyStudent类,并且需要实例化相应的ISchool对象,以便您的学生成为该学校的成员。
ISchool school = SchoolFactory.ConstructForStudent(myStudent);
现在,您的应用程序中有一个地方包含业务逻辑,该业务逻辑确定要为不同的IStudent对象实例化什么ISchool对象。
So -对于简单的类(值对象等)构造函数很好(您不想过度设计您的应用程序),但对于复杂的类层次结构,工厂方法是首选方法。
这样,您就遵循了gang of four book的第一个设计原则:“程序是接口,而不是实现”。
发布于 2009-03-10 07:26:10
您需要阅读(如果您有权阅读) Effective Java 2 第1项:考虑使用静态工厂方法而不是构造函数。
静态工厂方法的优点:
<>G212>
静态工厂方法的缺点:
https://stackoverflow.com/questions/628950
复制相似问题