2012-01-23 55 views
0

我们正在开发一个应用程序来处理各种XML消息并将它们加载到数据存储中。我正在使用的一个开发人员使用反射创建了一个Singleton工厂,以创建适当的消息子类的实例。我的问题是围绕使用工厂单例...(使用相同的东西来构建SqlCommand对象需要传递给DB)。在这里工厂肯定是有道理的,我对模拟使用Singleton与Factory相结合的部分很感兴趣。Singleton Factory解析消息

我已经阅读了很多贴子,stackoverlow响应等,它仍然不清楚为什么在这种情况下,我们会使用该模式(Singleton与工厂...我会假设只使用工厂模式? )。

只是为了更好地理解我收集的内容,当想要确保只有一个接口时,您想使用Singleton

+3

立即停止并阅读[DI容器](http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx)。研究理论和实践。了解生命周期管理和构造器注入。这些将消除Singleton,允许您编写松散耦合且可测试的代码,并且可以消除对工厂的需求。 – TrueWill

+0

我会看看@TrueWill – scarpacci

回答

1

单身人士不确保一个单一的界面;它们确保一个对象的单个实例可以被其他对象全局访问。您可能希望使用单例的一个示例是,您需要可在应用程序中的任何位置访问的计数器。换句话说,该单个对象的状态在整个应用程序生命周期中保持不变。

另一方面,工厂用于创建对象,您不必知道返回的类的确切类型。例如,您可能有一个返回汽车物体的工厂,但返回的确切类可能是大众汽车,也可能是法拉利。

工厂用于依赖注入(DI)。因此,在您给出的示例中,您可以使用工厂来返回与数据库接口的对象,但实际的类可能会使用SQL语句与数据库进行交互,也可能是另一个使用对象关系映射(ORM)框架的类。这将实际的数据库接口/实现从应用程序的其余部分中分离出来,并允许将更改数据库访问的更多灵活性。工厂甚至可以返回可用于单元测试的数据库访问模型。 DI可用于更改运行时使用的方法。出于这些原因,我肯定会推荐使用工厂。

工厂也可以返回单身人士。因此,在确定您是否需要单例时要问的问题是,是否需要在应用程序中为所有将访问此对象的对象维护状态。想要维护状态的一个示例是,您希望在应用程序的整个生命周期中,为任何访问此DB对象的对象保持连接对数据库的开放。不建议你这样做,但它只是为什么你可能希望在应用程序的整个生命周期中维护该对象的状态信息的一个例子。