需要初始化对象时使用的设计模式?

Mil*_*hev 6 c# java oop design-patterns

我有一个类,它有一个Initialize方法,它在数据库中创建了一堆表.这个类看起来像这样:

public class MyClass
{
  private bool initialized = false;

  public void Initialize()
  {
    if(!initialized)
    {
        //Install Database tables
        initialized = true;
    }
  }

  public void DoSomething()
  {
    //Some code which depends on the database tables being created 
  }

  public void DoSomethingElse()
  {
    //Some other code which depends on the database tables being created 
  }
} 
Run Code Online (Sandbox Code Playgroud)

DoSomething和DoSomethingElse这两个方法需要确保在继续之前调用了Initialize方法,因为它们依赖于数据库中的表.我有两个选择:

  1. 在类的构造函数中调用Initialize方法 - 这似乎不是一个好主意,因为构造函数现在应该调用方法,这些方法非常重要并且可能导致异常.

  2. 在两种方法中的每种方法中调用Initialize方法 - 这似乎不是一个很好的解决方案,尤其是如果有多个方法.

是否有一种设计模式可以更优雅地解决这个问题?

And*_*ner 8

我将使用一个静态工厂方法,在其中Initialize调用,并使构造函数私有,以强制使用静态工厂方法:

public class MyClass
{
  private MyClass() { ... }

  public static MyClass createInstance() {
    MyClass instance = new MyClass();
    instance.Initialize();
    return instance;
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,我会删除initialized变量 - 部分原因是因为您不再需要它 - 而且还因为它需要一些保证可见性(例如同步,易失性或AtomicBoolean)以保证线程安全的方法.

我认为MiškoHevery关于(不)在构造函数中工作博客文章是一个有趣的读物.