如果它跨请求共享实例,它仍然是工厂吗?

时间:2010-12-07 01:49:32

标签: .net design-patterns factory-pattern

好的,这完全是语义和命名......但是,如果使用它来返回单例实例,我的实现仍然是工厂模式吗?

也就是说,如果它只构造一个新的实例一次,它是否仍然适合称为工厂:

// am I still a factory?
public static class SomeFactory 
{
  [ThreadStatic]
  private static object _currentSomething;

  public static object Something
  {
     get { return _currentSomething ?? _currentSomething = new object(); }
  }
}

2 个答案:

答案 0 :(得分:2)

是的,它只是一个单身工厂。

答案 1 :(得分:1)

看起来工厂,我认为这是最好的相似之处。看起来你正在努力建立一个Singleton工厂。但是有些事情感觉不对劲。

也许是因为它只会返回一个物体...除非你要做一些与众不同的事情。你打算用这个做什么?啊......我看,正如@LukeH所说,一个线程单身人士。

修改 我个人认为,正如所写,它是一种模式的模式。代码只能返回一个对象而只能一个对象。这就是我修改个人风格代码的方法。如果我的解释错了,请纠正我:

static void Main()
{
    object obj1 = SomeFactory.Something;
    Console.WriteLine("obj1 hash:{0}", obj1.GetHashCode());

    object obj2 = SomeFactory.Something;
    Console.WriteLine("obj2 hash:{0}", obj2.GetHashCode());

    Console.Read();
}

public static class SomeFactory
{
    [ThreadStatic]
    private static object _currentSomething;

    public static object Something
    {
        get
        {
            if (_currentSomething != null)
            {
                return _currentSomething;
            }
            else
            {
                _currentSomething = new object();
                Console.WriteLine("Returning new object - hashcode: {0}", _currentSomething.GetHashCode());

                return _currentSomething;
            }
        }
    }
}

Writelines确认,但不成熟,我只在主线程上得到一个对象。很酷......但是使用其他自定义对象怎么样?

第二编辑:

我会考虑这样的事情:

public static class GenericFactory<T> where T : new()
{
    [ThreadStatic]
    private static T _currentSomething;

    public static object Something
    {
        get
        {
            if (_currentSomething != null)
            {
                return _currentSomething;
            }
            else
            {
                _currentSomething = new T();
                Console.WriteLine("Returning new {0} - hashcode: {1}", _currentSomething.GetType(), _currentSomething.GetHashCode());

                return _currentSomething;
            }
        }
    }
}