2016-03-29 3 views
0

Похоже, что этот перегруженный конструктор сам по себе является интерфейсом, чтобы создать шаблон Singleton - это то, что происходит?Является ли это шаблоном Singleton

Является ли это общим конструктором идиом в C#?

class clDBaccess 
{ 

    // private field 
    private readonly string conn; 


    public clDBaccess() 
    : this(ConfigurationManager.ConnectionStrings["foo"].ConnectionString) 
    { 
    } 
    public clDBaccess(string connectionString) 
    { 
    this.conn = connectionString; 
    } 
    ... 
    ... 
+0

так выглядит, в соответствии со вторым фрагментом принятого ответа здесь http://stackoverflow.com/questions/17034475/in-c-sharp-what-category- do-the-colon-fall-in-and-what-does-it-действительно, что двоеточие не информирует компилятор о наличии наследования или интерфейсе, а просто говорит запустить другой конструктор. Увидев это в том, что другой принятый ответ, кажется, подразумевает, что да, это идиома. – whytheq

ответ

8

Singleton шаблон имеет конструктор который вызывается один раз когда-либо. Это просто перегрузка метода, чтобы обеспечить хорошие значения по умолчанию для конструктора без параметров.

Вы можете вызвать конструктор и создать столько случаев, сколько хотите, так что это не синглтон.

6

Нет. Конструктор по умолчанию здесь просто удобен для использования строки подключения foo от app.config. Ничто не мешает созданию нескольких экземпляров этого класса, но если вы создадите их с помощью конструктора по умолчанию, они будут подключаться к одной и той же базе данных (но не обязательно будут использовать одно и то же соединение).

Одной из причин этого является то, что conn свойство readonly - это необходимо быть инициализируется конструктором (и не может быть изменен после того, как конструктор делается), и поэтому конструктор по умолчанию пытается инициализировать его из meanigful вместо установки его на нуль или string.Empty.

6

Нет, и любой подходящий singleton должен иметь защищенный конструктор.

using System; 

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 
+3

Мне показалось забавным, что вы упоминаете о необходимости «защищенного конструктора», а затем используете «private constructor». – zzzzBov

+3

Частный только более защищенный, чем защищенный. Оба они все еще защищены. – Eric

+1

использовать этот закрытый статический волатильный экземпляр Singleton; как указано в этом документе https://msdn.microsoft.com/en-us/library/ff650316.aspx и по этой ссылке https://msdn.microsoft.com/en-us/library/x13ttww7.aspx – rashfmnb

3

«Singleton» означает, что может быть как никогда один экземпляр класса. Обычно вы найдете свойство public static, которое возвращает единственный экземпляр этого класса.

Чтобы гарантировать, что класс не может быть экземпляр более одного раза, конструктор (ы) обычно будет закрытым.

Это не тот случай. Это обычный класс с двумя конструкторами, где конструктор без параметров «перенаправляет» на предпочтительный конструктор с полезным значением по умолчанию.

1

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

Например:

public class Singleton 
{ 
    private Singleton() 
    { 
    } 
    private static Singleton instance = new Singleton(); 
    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 
Смежные вопросы