2010-04-06 26 views
8

Bugün bir sorunla karşılaştım ve bir arkadaşım global statik bir örnek veya daha zarif bir tekil kalıp kullanmama önerdi. Bir kaç saat bekarlarım hakkında okumuştum ama birkaç şey hala beni kaçar.Genel statik örnek yerine singleton kullanma

Arka plan: Neyi başarmaya çalışıyorum bir API örneğini oluşturmak ve tüm sınıflarımda bu yeni örneği kullanmak (yeni bir bağlantı yapmak yerine, vs.).

Tek bir satır oluşturmanın yaklaşık 100 yolu var gibi görünüyor, ancak yoda'dan bazı yardımlarla bazı iş parçacığı örnekleri buldum.

public sealed class Singleton 
{ 
    public static Singleton Instance { get; private set; } 

    private Singleton() 
    { 
     APIClass api = new APIClass(); //Can this be done? 
    } 

    static Singleton() { Instance = new Singleton(); } 
} 

/nasıl bu yeni sınıf örneğini olur ve nasıl ayrı sınıftan çağrılmalıdır: ..Bu yüzden aşağıdaki kodu verilen?

DÜZENLEME: Ben Singleton sınıf

Singleton obj1 = Singleton.Instance(); 

gibi bir şeyle çağrılabilir fark ama API'ler Sınıf içinde yöntemlerine erişmek mümkün olacaktır (yani obj1.Start.)? (gerek yok, sadece soruyorum)

EDIT # 2: Cevabı kontrol etmek için biraz erken olmuş olabilirim ama hala bana sorun çıkaran küçük bir şeyim var. API gayet iyi çalışıyor, ne yazık ki iki örneği başlatamıyorum?

Yeni Kod

public sealed class SingletonAPI 
{ 
public static SingletonAPI Instance { get; private set; } 

private SingletonAPI() {} 

static SingletonAPI() { Instance = new SingletonAPI(); }  

// API method: 
public void Start() { API myAPI = new API();} 
} 

ama

SingletonAPI api = SingletonAPI.Instance; 
api.Start(); 
SingletonAPI api2 = SingletonAPI.Instance; // This was just for testing. 
api2.Start(); 

ben birden fazla örneği başlayamaz belirten bir hata olsun ... Böyle bir şey yapmak çalışırsanız.

+4

Gitmelisiniz Ayrıca, bir başka sınıfın Singleton'unuzun bir kopyasını almasını engellemek için özel bir kurucu ekleyin. –

+0

Teşekkür ederim, bunu özledim. – Ryan

+0

Api sınıfında, açıkta kalmadığından yöntemleri arayamayacaksınız. –

cevap

9

Neden singleton'a halka açık bir APIClass özelliği eklemiyorsunuz?API sınıfında yazarı ise

Singleton.Instance.API.DoSomething(); 

Veya, bunun yerine bir singleton sararak arasında, o a tek kendisi yapabilir:

public sealed class Singleton 
{ 
    public static Singleton Instance { get; private set; } 

    private APIClass _APIClass; 

    private Singleton() 
    { 
     _APIClass = new APIClass(); 
    } 

    public APIClass API { get { return _APIClass; } } 

    static Singleton() { Instance = new Singleton(); }  
} 

Sonra çağıran sitesi benziyor

public sealed class SingletonAPI 
{ 
    public static SingletonAPI Instance { get; private set; } 

    private SingletonAPI() {} 

    static SingletonAPI() { Instance = new SingletonAPI(); }  

    // API method: 
    public void DoSomething() { Console.WriteLine("hi"); } 
} 

API çağrısı:

SingletonAPI.Instance.DoSomething(); 
+1

@charles Çok teşekkür ederim, tam da ihtiyacım olan şey buydu. – Ryan

3

Sınıfı başlatamazsınız - kullandığınız kalıp temel olarak ilk kez kullanıldığında kendini gösterir. Kullandığınız yöntemin avantajı, iş parçacığı güvenli olmasıdır (yalnızca bir kereye mahsus olmak üzere, bir kereye mahsus kaç tane iş parçacığı erişmeye çalışırsa çalışsın), tembel (Tekton sınıfına erişmeye çalışana kadar örnekleme yapmaz) ve basittir uygulamada.

Bunu kullanmak için yapmanız gereken tek şey yapmaktır: alternatif olarak

Singleton.Instance.MyMethodOnSingleton(); 

Veya:

İşte
Singleton myInstance = Singleton.Instance; // Will always be the same instance... 
myInstance.DoSomething(); 
+0

Ayrıca Farstucker msdn http://msdn.microsoft.com/en-us/library/ms998558.aspx – vittore

+0

hakkında tektonlar hakkında okuyup tavsiye ederim, bunu okudum ya da yapmadım. Sanırım tamamen farklı bir sınıfın nasıl oluşturulacağı ve dünya çapında nasıl kullanılacağı konusunda kafam karıştı. Ne yapmaya çalıştığımı açıklamaya yardımcı olmak için bir kod ekledim. – Ryan

5

official Microsoft approach olduğunu.

Tekilliğin güzelliği, sınıfın bir örneğini oluşturmak zorunda kalmadan kodunuzda herhangi bir yere erişip ona erişebilmenizdir. Aslında bu varoluş nedeni, bir sınıf ör

Singleton.Instance.MyValue ve Singleton.Instance.DoSomething() tek bir örneği var olduğunu;

İlgili konular