日期:2011-03-08  浏览次数:20437 次

考虑一个问题。我们现在需要一个类的实例来协助我们完成某项功能。这在面向对象的开发过程中是常见的。在使用这个类的实例的时候,我们还需要对他进行一些初始化的工作。另外,为了保证我们的代码具有一定的扩展性,我们不想关心这个类的具体细节,并且希望在将来问题发生变化的时候,我们可以不改变我们的代码就可以改变这个类的行为。
现在问题在于,初始化工作同这个类的具体细节密切相关。类的行为不同,初始化的工作也不同。但是这个类本身只是提供一些辅助性的工作,在它的内部,也同样不关心外部调用环境,也就是我们的代码中的细节。这样就产生了矛盾:不知道这个类的细节,我们不能做初始化工作,这个类本身不能做初始化工作。我们为了扩展性不想知道类的细节。
为了解决这个矛盾,就可以使用设计模式中的工厂方法。
这个方法在设计模式这本书中是这样定义的:定义一个用于创建对象的接口,让子类决定将那个类实例化。
这样,对于上述矛盾,我们可以做这样的设计:
我们需要的协助类叫做Product
定义一个类Factory。他有一个方法叫做CreateProduct(),这个方法返回一个Product类的实例。这个方法是Overridable 的,以便子类覆盖。
假设我们的客户端代码是ClientFun()方法,他有一个参数,类型为Factory:ClientFun(f as Factory)
我们可以把初始化工作放在CreateProduct方法中。
ClientFun()代码中,在需要Product类实例的时候,调用f.CreateProduct()方法,获得Product类的实例。
在需要新的Pruduct实例的时候,我们可以创建一个Factory的子类,在这个子类中覆盖CreateProduct方法,返回一个新的Product实例,并进行新的初始化工作。