保证对象的多个实例

时间:2011-01-22 16:06:47

标签: design-patterns

我真的不知道如何正确地命名这个问题。我有一个特定的场景,我有一个对象,无论何时使用都应该处理掉。原因有两个:

  1. 我必须保证在任何新用途之前初始化每个成员变量( field )。
  2. 我必须保证不会同时调用此对象的两种方法,因为它不是线程安全的。
  3. 对象中可以涵盖这两个原因,让每个公共方法锁定相同的 mutex 并初始化私有方法上的每个变量,这也在每个公共方法上调用。

    此解决方案容易出错,并且在多线程方案中序列化访问会产生副作用,因为我将在使用前锁定对象。当然,调用站点可以在调用方法之前创建一个新实例(删除副作用),但它也容易出错。

    所以我提出了一个解决方案,我发现它既干净又非常奇怪:

    我的对象公开静态方法,它们具有创建对象的新实例和执行方法所需的变量作为参数。此静态方法创建对象的实例,然后调用必要的方法。

    当然,构造函数是私有的。

    当我看到这个解决方案时,我注意到的第一件事是我的对象看起来很像一个程序方法,当然,因为每个新方法调用都需要一个新对象。但是这个对象的责任很适合这个方案。

    我的问题(最后!,我知道)是:

    • 是否有符合我要求的模式(总是使用对象的新实例)?
    • 是否有描述我的方法的模式?或者它是一种反模式?
    • 除了对象看起来像程序功能的集合这一事实外,还有其他原因让我没有这种方法吗?

    感谢您提出任何意见。

3 个答案:

答案 0 :(得分:1)

您没有说出您正在使用的语言(最好使用标签)。在C#中,我会执行以下操作:

  1. 将字段设为私有,仅通过属性公开它们。
  2. 在施工时初始化字段。
  3. 由于该类显然需要是线程安全的(“必须保证不会同时调用此对象的两个方法”),因此请将其设置为线程安全的。使用锁保护可变共享状态。
  4. 实施Dispose pattern,使客户负责处理实例。
  5. 静态方法固有地将您的具体类耦合到任何客户端类。除此之外,这使得客户端类难以单独测试。

答案 1 :(得分:1)

与您的解释一样,它只是旧程序函数的类语法包装。这实际上不是一类对象。我认为没有像这样的非OOP编程的OOP模式(除了Singleton?)。

这样的设计有什么意义,增加了在函数内部创建和销毁一次性使用对象的内存/性能开销?

顺便说一句,你可以将课程分成两个班级。一个用于资源保持另一个用于资源操作。让客户决定最合适的资源管理方案,并将资源保持对象传递给操作类的方法。

答案 2 :(得分:0)

没有内置的方法来确保不重复使用对象,但我可以想到一些方法可以尝试鼓励它。如果用户想要的话,所有这些都可以得到。

  1. 如果对象只有一次调用它,那么您可以在创建对象时在对象内部设置“状态”,然后在调用方法后将状态设置为“已使用”状态。这有各种各样的问题,但是可能的解决方案。
  2. 您可以强制用户“获取令牌”以使用该对象。然后,当使用该对象时,它们必须传递该令牌,然后该对象将该令牌与“使用的令牌”列表进行比较,并且仅在它不存在时才允许它起作用。同样,问题是它基本上只有在你只调用一次的方法时才有效。
  3. 在对象本身内调用dispose,基本上会破坏你创建的任何资源,所以第二次使用会抛出异常......