Шаблон для создания экземпляра класса только из одного места? - PullRequest
4 голосов
/ 01 сентября 2010

C # .Net 4.0

Я хотел бы знать, как я могу иметь класс, который может быть создан только из одного единственного места. Пример:

У меня есть Провайдер класс. Этот класс предоставляет метод с именем GetData . Когда вызывается GetData , провайдер создает экземпляр класса Data , заполняет и возвращает его. Класс Data не может быть создан никем, кроме поставщика 1018 *, поэтому единственный способ получить доступ к данным будет через Provider . Как только GetData вызван и вызывающий получил экземпляр класса Data , он должен иметь возможность доступа к свойствам / методам этого класса.

Как это можно сделать? Есть ли шаблон для такого рода проблем? Короткий образец будет высоко ценится. Заранее спасибо!

Ответы [ 4 ]

8 голосов
/ 01 сентября 2010

Звучит так, как будто вы ищете фабричный шаблон :

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

По сути, ваш класс Provider является фабрикой, которая контролирует создание экземпляров класса Data.

Одна вещь, которую вы могли бы контролировать, это поместить эти два типа в их собственную сборку и сделать конструктор для Data равным internal, но сам класс public. Это будет означать, что любой, кто ссылается на сборку, будет вынужден использовать класс Provider для создания экземпляров Data (если, конечно, они не использовали отражение).

6 голосов
/ 01 сентября 2010

Другое решение - создать интерфейс IData и объявить метод Provider.GetData, возвращающий IData вместо Data.Тогда ваш класс Data может быть вложен в Provider.Таким образом, ваш класс Data не может быть создан даже классами в одной сборке.Вот пример:

public interface IData
{
    // properties and methods
}

public class Provider
{
    public IData GetData()
    {
        return new Data();
    }

    private class Data : IData
    {
        // your implementation
    }
}
1 голос
/ 01 сентября 2010

Вот пример того, что описал Андрей:

public class Data
{
    internal Data()
    {
        // internal constructor cannot be called from outside the assembly
    }

    // properties, fields and methods
}

public class Provider
{
    public Data GetData()
    {
        return new Data();
    }
}
0 голосов
/ 01 сентября 2010
public class Provider
{
  protected Provider()
  {
  }

  public static Provider CreateNewProvider()
  {
    return new Provider();
  }
}
...