18 Şubat 2014 Salı

Singleton

Gang of Four
Tasarım örüntülerinin amaçlarından bir tanesi low coupling, high cohesion'a sahip kodlama yapmak.

High Coupling Örneği
Örnekte bir sınıf değişince bir başka sınıfın da etkilenmesi gösteriliyor. Bu durum high coupling için tipik bir sonuç.


Singleton

Singleton kavram olarak çok basit olmasına rağmen, farklı bir çok şekilde yaratılabiliyor. Aşağıda gördüğüm örnekleri toplamaya çalıştım.

C++

Static Metod Değişkeni Olarak
Bu örnekte, singleton nesnesi statik olarak getInstane metodu içinde tanımlanıyor.
Örnekte copy constructor C++11 yöntemiyle etkinsizleştirilmiş. Dolayısıyla aşağıdaki gibi kullanılması engellenmiş.
Object singleton = Object::instance(); //Hata verir
Object& singleton = Object::instance (); //Ok
Java
Lazy Singleton
İlk örnek en basit olanı.

Bu örnekte ise class loader kullanılarak, singleton sınıfının  bir defa yüklenmesi sağlanıyor.

Aşağıdaki örnekte Singleton'mış gibi görünen ancak gerçekte Factory olan tuhaf bir kullanım şekli var. Tam anlamıyla bir anti-pattern diye düşünüyorum.


Enum şeklinde Singleton
Bu alışılageldik bir yöntem değil. JVM'in kendi içinde kullandığı bir kilit ile bu nesneyi yarattığı dolayısıyla thread-safe olduğu belirtilmiş.
Örnek:
public enum UserActivity {
INSTANCE
;

public void dostuff() {
...
}
}

// use it as ...
UserActivity.INSTANCE.doStuff();
C#
Örnek'te bir ata sınıftan kalıtma gösterilmiş:
Ata sınıf:
public abstract class Singleton<ClassType> where ClassType : new()
{
static Singleton()
{
}

private static readonly ClassType instance = new ClassType();

public static ClassType Instance
{
get
{
return instance;
}
}
}
Kalıtan sınıf:
class Example : Singleton<Example>
{
public int ExampleProperty { get; set; }
}
Kullanım:
public void LameExampleMethod()
{
Example.Instance.ExampleProperty++;
}




Hiç yorum yok:

Yorum Gönder