Это все еще фабрика, если она делит экземпляры между запросами? - PullRequest
1 голос
/ 07 декабря 2010

Хорошо, это полностью семантика и наименование ... но моя реализация все еще является фабричным шаблоном, если он используется, например, для возврата экземпляра синглтона?

То есть, все еще правильно вызыватьэто фабрика, если она только один раз создает новый экземпляр:

// 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 ]

2 голосов
/ 07 декабря 2010

Да, это просто фабрика-одиночка.

1 голос
/ 07 декабря 2010

Это выглядит фабрикой, и я думаю, что это лучшее из сходства. Похоже, вы пытаетесь создать Синглтон Фабрику. Но в этом есть что-то, что кажется неправильным.

Может быть потому, что он только когда-нибудь вернет объект ... если вы не собираетесь делать что-то другое. Что вы планируете делать с этим? Ах ... Я вижу, как говорит @LukeH, синглтон-нить.

EDIT: Мое личное мнение заключается в том, что, как написано, это шаблон для шаблона. Код ничего не может сделать, кроме как вернуть объект и только объект. Вот как я изменил код для личного стиля. Пожалуйста, поправьте меня, если я ошибаюсь с моей интерпретацией:

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;
            }
        }
    }
}

Письменные строки подтверждают, хотя и элементарно, что я получаю только один объект в главном потоке. Круто ... а как насчет использования других пользовательских объектов?

2-е редактирование:

Я бы рассмотрел что-то вроде:

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;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...