0

我想实现一种根据用户配置加载(和管理)对象的类(也可能是Manager Design Pattern)(多对象中的每个对象的关键字是配置记录)。如果检测到配置变化,则对这些对象进行处理并重新创建(即重新加载)。受管实例的同步

其他对象(管理对象外部)与这些“受管理”对象进行交互/通信。

例如,
ManagerA管理配置的ClassA实例的实例。 ObjectB通过ManagerA检索ClassA的实例,并启动 与实例进行交互。

的问题是,对象B和ClassA的的管理实例之间的相互作用可以潜在地在另一个线程上比在其上ManagerA处置ClassA的实例,并创建ClassA的的新实例(用于新改变的配置) 。即托管实例可以像与被管理对象进行交互一样(或刚好)与托管对象进行交互。

我的问题是如何通过外部对象来同步实例管理和交互与这些托管实例?

+0

简单的解决方案:不要处置()他们。为什么这是需要呢? –

+0

托管实例实际上使用它们的一次性实例,因此它们需要处理,否则系统资源将泄漏或锁定,直到GC收集对象。例如。作为其功能的一部分,实例被配置为与串行端口进行交互。我不应该解释为什么需要处理...... –

+0

从您的链接页面:管理器控制对管理的所有访问,所以您不应该出现这种情况。和/或这是错误的模式。 –

回答

0

这是相当困难的,没有代码,伪代码,或者这样的规定,但是...

如果客户端与排队行动管理协议对象进行交互,和动作该队列是寿命较长的中托管的协议对象,也许最好是从托管协议中分离出这个队列,并且只将类似队列的对象的引用传递给客户端。

当某个东西入队时,让你的类队列对象检查一个正确配置的协议对象并使用它。我假设它在使用中(意味着字节在电线上飞行),它不能被改变/配置。之后,一个动作已经完成,让类队列对象然后检查协议对象回到你的经理。在签入时,如果管理器检测到配置中的更改,它可以处置并重新创建协议对象,如果不是,那么它仍然坐在那里准备好下一次使用。如果在检测到配置更改时该对象当前未被检出,则该重放步骤可以立即发生。

客户端从这些细节中被屏蔽掉,因为它从不直接访问协议对象。 (虽然如果这是一项要求,那么您仍然可以将签入和签出概念应用于协议对象以确保它们是最新的,但由于客户端可能忘记签入,所以执行起来很难。并重新结账)。

+0

你的方法听起来像是对每个被管理对象执行一个[多读者 - 单作者](http://bit.ly/OYZ0ts)锁定。它多次讨论了我的想法,但它有明显的问题(其中一个与你在文章末尾提到的相同:客户可以'忘记'解锁参考文献;并且坦率地说它会给'客户'带来管道负担对象管理)。部分帖子还建议使用[调解器模式](http://bit.ly/Sn1DEM);我现在正在尝试,它看起来很有希望。 P.S.谢谢(和其他人)努力尝试并回答此问题。 –

+0

我同意,我更喜欢根据“行动”排队和完成而自动进行入住/退房的版本。但是,如果没有伪代码或图表等,很难提出建议。了解你的客户端对象如何与协议对象交互会有帮助(除非它真的是一个单一的“入队”方法)。 – tcarvin