2010-03-08 3 views
6

Хорошо, если я создаю одноэлементный класс и выставляю объект singleton через общедоступное статическое свойство ... Я это понимаю.Свойства Singleton

Но мой класс singleton имеет другие свойства. Должны ли они быть статическими? Должны ли они быть частными?

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

MySingletonClass.SingletonProperty.SomeProperty2 

Где SingletonProperty возвращает меня единственный экземпляром одноплодный. Я предполагаю, что мой вопрос в том, как вы показываете другие свойства в singleton-классе. Сделайте их частными, а затем получите доступ к ним через ваше общедоступное одноэлементное свойство static?

Или все ваши другие свойства и методы одноэлементности должны быть общедоступными нестационарными?

+1

обязательная ссылка против использования синглетов: http://www.codingwithoutcomments.com/2008/10/08/singleton-i-love-you-but-youre-bringing-me-down/ и –

ответ

17

После того, как вы получите SingletonProperty (который является единственным экземпляром объекта), все, что после этого может быть реализовано так, как если бы вы создавали класс, подлежащий инстанцированию, потому что Singleton действительно является единственным экземпляром обычного объекта.

Например, следующий Singleton (очевидно, не лучший дизайн Singleton, но несут с собой) предлагает два открытых свойств под названием Value и Имя:

public class MySingleton 
{ 
    private static MySingleton _instance;  

    private MySingleton() { } 

    public static MySingleton Instance 
    { 
     get 
     { 
      if(_instance == null) 
       _instance = new MySingleton(); 

      return _instance; 
     } 
    } 

    // Your properties can then be whatever you want 
    public string Value { get; set; } 

    public string Name { get; set; } 
} 

Доступ к этим свойствам будет выглядеть так:

MySingleton.Instance.Name = "StackOverflow"; 

MySingleton.Instance.Value = "Rocks!"; 
+0

gotcha. В то время как остальные являются общедоступными, единственный способ добраться до них - через любое свойство, предоставляющее экземпляр singleton. Благодарю. – PositiveGuy

+0

, а затем в частном конструкторе я могу установить состояние там ... – PositiveGuy

+3

Чтение и запись с/на свойства Name и Value не являются потокобезопасными; к сожалению, вам нужно будет использовать объект блокировки для каждого свойства. –

2

Сделайте их общедоступными, как и любой другой класс. Использование singleton-шаблона не зависит от этого.

1

До тех пор, пока они не являются статическими, вам нужен экземпляр объекта для доступа к свойству. И если единственный способ создать экземпляр объекта - через шаблон singleton, ваши свойства класса являются неотъемлемой частью экземпляра одного класса. Ничего особенного не требуется.

2

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

0

Ваш MySingletonClass.SingletonProperty возвращает ссылку на экземпляр класса Singleton. Таким образом, вы можете использовать общедоступные свойства (и методы и т. Д.), Как и любой другой экземпляр класса.

MySingletonClass.SingletonProperty.SomeProperty2 

Когда вы бы SomeProperty2 статическими, вы можете сделать следующее (но это не в духе шаблона проектирования Singleton):

MySingletonClass.SomeProperty2 
1

Они должны быть нестатическими общественными свойствами.

Подумайте об этом. Вы один один экземпляр этого класса, но все же экземпляр.

Таким образом, вы делаете свой конструктор частным и создаете статическое свойство, которое обрабатывает ленивое создание.

Все остальные свойства, члены и методы должны быть просто частью экземпляра - экземпляр, который вы теперь обеспечили, будет единственным и единственным.

Смежные вопросы