Oluşturma Modeli: Singleton

Dec 04 2022
Bu makalede, Singleton modelinin bir sınıfın yalnızca tek bir örneğini üretilmeye ve bir uygulamanın ömrü boyunca var olmaya nasıl zorladığı anlatılmaktadır. Bu ne? Singleton, tek sınıf örneğini oluşturmak için kullanılan bir tasarım desenidir.

Bu makalede, Singleton modelinin bir sınıfın yalnızca tek bir örneğini üretilmeye ve bir uygulamanın ömrü boyunca var olmaya nasıl zorladığı anlatılmaktadır.

Bu ne?

Singleton, tek sınıf örneğini oluşturmak için kullanılan bir tasarım desenidir. Singleton modeli tipik olarak, bir sınıfın yalnızca tek bir örneğinin var olması ve kısıtlamanın uygulanması gereken birkaç örnek olduğunda kullanılır. Örneğin, önbellekler, iş parçacığı havuzları ve kayıt defterleri yalnızca bir örneğe sahip olmalıdır.

Yalnızca bir sınıf nesnesinin oluşturulmasını sağlamak için yapıcıyı özel yapın. Bu şekilde, özel kurucuya yalnızca sınıf üyeleri erişebilir, başka kimse erişemez.

Gerçek dünyada Singleton modeli, yalnızca tek bir sınıf örneğinin var olmasını sağlar ve ona küresel bir erişim noktası sunar.

Sınıf diyagramı

Sınıf diyagramı yalnızca bir varlık içerir.

Tekil

Örnek

Amerikan Başkanı'nın Airforce One adlı resmi uçağını yazılımımızda modellemek istediğimizi varsayalım. Singleton sınıfı, yalnızca bir örneğe sahip bir varlık için en uygun temsildir.

İşte singleton sınıfımızın kodu:

Çoklu kullanım ve Singleton

Bu kod, uygulama tek iş parçacıklı olduğu sürece çalışır. Ancak, birden çok iş parçacığı bu sınıfa erişirse, çeşitli nesnelerin oluşturulma olasılığı vardır.

Örneğin:

  • Thread A, yöntemi çağırır ve null olarak getInstancebulur ; onlyInstanceancak, bir örnek oluşturmadan önce bağlam kapatılır.
  • Şimdi iş parçacığı B gelir ve getInstancenesneyi döndüren çağırır AirforceOne.
  • A dizisi yeniden programlanırsa, yaramazlık başlar. İş parçacığı, if-null koşul denetimini zaten geçti ve yeni bir nesne oluşturmaya AirforceOneve onu onlyInstance. AirforceOneŞimdi vahşi doğada biri A ipliğine ve diğeri B ipliğine sahip iki farklı nesne var.
  • synchronizedYönteme ekleyerek getInstance()iplik güvenliğini sağlayabilirsiniz.
  • Başka bir seçenek de, iş parçacığı açısından güvenli olduğunu garanti ederek örneği statik olarak başlatmaktır.

Çift Kontrollü Kilitleme

Yukarıda açıklanan yaklaşımlarla ilgili iki önemli sorun vardır: senkronizasyon pahalıdır ve statik başlatma, belirli bir uygulama çalıştırmasında kullanılmasa bile nesneyi oluşturur. Nesne oluşturma pahalıysa, statik başlatma performansımıza mal olabilir.

Yukarıdaki çözüm, tekil örneği geçici olarak işaretler. Bununla birlikte, JVM'nin volatilemetodolojisinin bu uygulaması, çift kontrollü kilitleme için doğru şekilde çalışmaz ve tekillerinizi oluşturmak için başka bir yaklaşıma ihtiyacınız olacaktır.

İki kez kontrol edilen kilitleme deyimi artık bir anti-kalıp olarak kabul ediliyor ve JVM başlatma süreleri hızlandıkça faydası esas olarak vefat etti.

Diğer Örnekler

Java API bize aşağıdaki tekilleri sağlar:

Java.lang.Çalışma Zamanı

java.awt.Desktop

Uyarılar

Yapıcıyı özel yerine koruyarak tek bir sınıfın alt sınıfını oluşturabilirsiniz. Ancak, her koşulda bundan daha iyi seçenekler var. Bu durumlarda, geliştiriciler tüm alt sınıflar için bir tekil kayıt defteri oluşturabilir. GetInstance yöntemi, istenen tekil nesneyi döndürmek için bir parametre alabilir veya bir ortam değişkeni kullanabilir. Kayıt defteri, dize adlarının tekil nesnelerle eşlenmesini sağlar.

Yaratılış Modeli serisindeki diğer makaleler