2009-09-15 94 views
7

我想知道工厂模式是否存在相反的模式。例如,当需要删除某个对象时,需要完成一些额外的工作,以撤消在工厂对象中执行的配置。哪种设计模式与工厂模式相反?

扩展与例如删除方法工厂对象似乎是错误的,因为工厂模式是严格的创建模式。

更新:为什么我使用了一个工厂的原因是因为它需要做的配置会引入一些依赖于这将不适合的对象。在构造函数中放置这个解除配置会导致同样的问题。

+2

你的意思是“删除”是什么意思?从内存中释放,还是从数据存储中移除? – 2009-09-15 07:54:11

+0

删除我的意思是从数据存储中删除它,这将由存储库完成。 – 2009-09-15 07:58:31

+0

以及在工厂对象中执行了哪种“配置”?一个对象应该能够自行清理,解构和/或处置任务。我认为工厂不应该知道它创建的任何对象。 – 2009-09-15 08:03:24

回答

3

这是使用工厂正道。工厂不仅是创建对象的方式,也是说方式:我需要对这些对象进行特殊的初始化。有了你的问题,我认为最好的解决方案是通知工厂一些事件,如处置。因此,您的对象创建将以这种方式完成:创建,订阅工厂到新创建对象的事件。每次删除对象,你都会通知工厂并执行你需要的操作。

如果你不喜欢把它放到工厂,你可以把它委托给某种其他对象,比如DeathKeeper ;-)。所以,你的代码看起来sometihng这样的:

//Inside factory create method 
MyObject obj = GetNewInitializedObject(); 
_detahKeeper.RegisterObject(obj); 

return obj; 

现在,每当你将需要删除的对象的时候,你的对象会通知死亡门将,它将使所有处置逻辑。顺便说一下,我不知道它是如何工作的,但是您可以使用IDisposable接口来执行用于处理由对象保存的资源的自定义逻辑。这个决定取决于你的项目中有什么,取决于你。

4

存储库可以用来删除一个持久对象,或者您可以使用Dispose方法做一些清理上只在内存中的对象。

+0

我现在将把这个“取消配置”放入存储库中。 – 2009-09-15 08:48:49

+0

您是否需要销毁任何持续的(数据库/文件)信息? – 2009-09-15 11:02:03

2

我用的是“回收设施”模式协同工作,与工厂:

  • 为每个可循环
  • 有一个“唯一ID”为每个对象类的一个“干净”的方法实例

每次对象到达其端部的寿命,将其发送到“回收设施”(RF):

  • RF根据某些策略(例如,只保留Y级的X实例)
  • 当需要Y类的一个实例,本厂​​以“问”如果有一个
    • 如果RF有一个方便的RF,射频所谓的“干净()上的实例”的方法,并返回到出厂

...等等等等。

希望这会有所帮助。