CodeGym /Java Blogu /Rastgele /Java'da Desenler ve Singleton
John Squirrels
Seviye
San Francisco

Java'da Desenler ve Singleton

grupta yayınlandı
Bu makale, tasarım desenleri kavramıyla ilk kez karşılaşan, singleton terimini duyan veya bir şekilde singleton modelini uygulayan ancak ne olduğunu anlamayan herkese yöneliktir. Hoş geldin! CodeGym öğrencileri tasarım modelleriyle ilk kez 15. Seviyede karşılaşıyorlar; kaptan beklenmedik bir şekilde onlardan Java Singleton modelini tembel uygulamayla uygulayarak anlayışlarını "güçlendirmelerini" istiyor. Singleton kalıbını ilk kez duyan öğrencilerin hemen birçok sorusu olur: Dünyada bir tasarım kalıbı nedir? Neden buna ihtiyacımız var? singleton nedir ? Ve son olarak, tembel uygulama nedir? Sırasıyla bu soruları cevaplayalım.

Dünyada bir tasarım deseni nedir?

Bu soruyu en iyi anlayışla cevaplamak için biraz tarihin olduğuna inanıyorum. İlginç bir fikirle ortaya çıkan dört ünlü programlama yazarı (Erich Gamma, John Vlissides, Ralph Johnson ve Richard Helm) var. Yazılım geliştirmenin genellikle yaklaşık olarak aynı sorunları çözmelerini ve aynı şekilde yapılandırılmış kod yazmalarını gerektirdiğini fark ettiler. Bu nedenle, nesne yönelimli programlamada sıklıkla kullanılması gereken tipik kalıpları tanımlamaya karar verdiler. Kitapları 1994 yılında Design Patterns: Elements of Reusable Object-Oriented Software başlığı altında yayınlandı. Kitabın adı çok uzun çıktı ve insanlar ona Dörtlü Çete'nin kitabı demeye başladılar. İlk baskı 23 desen içeriyordu. Daha sonra düzinelerce başka model keşfedildi.
Bir tasarım deseni, ortak bir soruna standartlaştırılmış bir çözümdür.
Singleton modeli de bunlardan sadece bir tanesi.

Neden tasarım modellerine ihtiyacımız var?

Kalıpları bilmeden programlayabilirsiniz: Sonuçta, Seviye 15'e geldiğinizde, CodeGym'de var olduklarını bile bilmeden yüzlerce mini program yazmışsınızdır. Bu, tasarım kalıplarının, ustayı amatörden ayıran bir tür araç olduğunu düşündürür: Tasarım kalıpları, tipik bir sorunun nasıl düzgün bir şekilde çözüleceğini tanımlar. Bu, kalıpları bilmenin size zaman kazandırdığı anlamına gelir. Bu yönüyle algoritmalara benzerler. Örneğin, blackjack ve sayılarla kendi sıralama algoritmanızı oluşturabilirsiniz.ve bunu yapmak için çok zaman harcayın ya da uzun zamandır anlaşılan ve tarif edilen birini uygulayabilirsiniz. Aynısı tasarım desenleri için de geçerlidir. Ek olarak, tasarım kalıpları ile kod daha standart hale gelir ve uygun kalıbı kullandığınızda, kalıbın yaygın tuzakları uzun zaman önce belirlenip ortadan kaldırıldığı için hata yapma olasılığınız azalır. Her şeyin ötesinde, kalıp bilgisi programcıların birbirlerini daha iyi anlamalarına yardımcı olur. Programcı arkadaşlarınıza uzun bir açıklama sağlamaya çalışmak yerine, basitçe bir kalıbın adını söyleyebilirsiniz. Özetle, tasarım kalıpları size şu konularda yardımcı olur:
  • tekerleği yeniden icat etmeyin, bunun yerine standart çözümler kullanın;
  • kodu standartlaştırın;
  • terminolojiyi standartlaştırmak;
Bu bölümü sonlandırmak için, tüm tasarım kalıpları gövdesinin üç büyük gruba ayrılabileceğini not ediyoruz: Desenler ve tekil - onlarla ilk kez karşılaşan herkes için - 2

Son olarak, singleton modeli

Singleton yaratıcı bir kalıptır . Bu kalıp, bir sınıfın yalnızca bir örneğinin olmasını sağlar ve bu nesne için genel bir erişim noktası sağlar. Açıklamadan, bu modelin iki durumda uygulanması gerektiği açık olmalıdır:
  1. programınız belirli bir sınıftan birden fazla nesnenin oluşturulmasını gerektirmediğinde. Örneğin, bir bilgisayar oyununda bir Kahraman sınıfı ve oyundaki tek kahramanı tanımlayan yalnızca bir Kahraman nesnesi olabilir.

  2. bir nesneye küresel erişim için bir nokta sağlamanız gerektiğinde. Başka bir deyişle, nesneyi programın herhangi bir yerinden kullanılabilir hale getirmeniz gerekir. Ne yazık ki, yazmaya karşı korumalı olmadığı için yalnızca bir küresel değişken oluşturmak yeterli değildir: herkes değişkenin değerini değiştirebilir, bu nedenle nesnenin genel erişim noktası kaybolabilir. Bir Singleton'ın bu özellikleri , örneğin bir veritabanıyla çalışan bir nesneye sahip olduğunuzda ve veritabanına programın farklı bölümlerinden erişmeniz gerektiğinde gereklidir. Singleton , hiç kimsenin daha önce oluşturulan örneği değiştiren kod yazmamasını sağlar.
Dolayısıyla, bir Singleton şu iki ihtiyacı karşıladı: programda belirli türden yalnızca bir nesne olmalı ve ona küresel erişim olmalıdır. 15. Seviyedeki örnekte, kaptan sizden aşağıdaki görev için bu modeli uygulamanızı istiyor:
  1. Yavaş başlatmalı bir Singleton örneği bulun .

  2. Aynı prensibi kullanarak ayrı dosyalarda üç tekil sınıf oluşturun - Güneş, Ay, Dünya.

  3. UygulamakGezegenGüneş , Ay ve Dünya sınıflarında arayüz .

  4. Solution sınıfının statik bloğunda,readKeyFromConsoleAndInitPlanetyöntem.

  5. uygulamakreadKeyFromConsoleAndInitPlanetyöntem işlevselliği:

    • 5.1. Konsoldan bir String parametresi okuyun

    • 5.2. Parametre aşağıdakilerden birine eşitseGezegenarayüzün sabitleri, uygun thePlanet nesnesini oluşturun.

Görev koşullarını dikkatlice okuduktan sonra, burada neden bir Singleton'a ihtiyaç duyulduğunu açıkça görebiliriz . Aslında, şu sınıfların her birinin birer örneğini yaratmamız isteniyor: Sun , Moon , Earth . Birden fazla Güneş/Ay/Dünya yaratmamamız gerektiğini varsaymak mantıklıdır. Aksi takdirde, tabii ki Star Wars versiyonunuzu yazmıyorsanız, saçma bir duruma düşeriz. Singleton kalıbını Java'da üç adımda uygulama Java'da, Singleton davranışı sıradan bir kurucu kullanılarak uygulanamaz çünkü bir kurucu her zaman yeni bir nesne döndürür. Bu nedenle, Singleton'ın tüm uygulamalarıyapıcıyı gizlemeye, tekil nesnenin ömrünü kontrol eden genel bir statik yöntem oluşturmaya ve yeni görünen tüm nesneleri "yok etmeye" kadar kaynatın. Bir Singleton'a erişilirse, ya yeni bir nesne oluşturmalı (eğer programda mevcut değilse) ya da mevcut bir nesneyi döndürmelidir. Bunu gerçekleştirmek için:
  1. Sınıfa, tek bir nesneyi depolayan özel bir statik alan vermeniz gerekir:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. (Varsayılan) yapıcıyı özel yapın. Bu, sınıf dışından erişilemeyeceği ve yeni nesneler döndüremeyeceği anlamına gelir:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance;
    private LazyInitializedSingleton(){} // #2
    } 
    
  3. Singleton'ı almak için kullanılacak statik bir oluşturma yöntemi bildirin:

    
    public class LazyInitializedSingleton {
        private static LazyInitializedSingleton instance;
            private LazyInitializedSingleton() {}
            public static LazyInitializedSingleton getInstance() { // #3
            if (instance == null) { // If the object has not yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
    
Yukarıdaki örnek biraz beceriksiz, çünkü biz sadece yapıcıyı saklıyoruz ve standart bir kurucu yerine kendi yöntemimizi sağlıyoruz. Bu makale, CodeGym öğrencilerinin bu kalıpla (ve genel olarak tasarım kalıplarıyla) temas kurmasını sağlamayı amaçladığından, daha karmaşık tekil uygulamaların nüansları burada açıklanmayacaktır. Yalnızca, programın karmaşıklığına bağlı olarak bu modelin daha da rafine edilmesi gerekebileceğini not ediyoruz. Örneğin, çok iş parçacıklı bir ortamda (iş parçacıkları hakkındaki makalelere bakın), birkaç farklı iş parçacığı tekil yönteme aynı anda erişebilir ve her ayrı iş parçacığı sınıfın bir örneğini oluşturabileceğinden yukarıda açıklanan kod çalışmayı durdurur. Sonuç olarak, uygun iş parçacığı güvenli tekil oluşturmak için hala birkaç farklı yaklaşım vardır. Ama bu başka bir hikaye =)

Ve son olarak... Kaptanın sorduğu bu tembel başlatma nedir?

Tembel başlatma, ertelenmiş başlatma olarak da adlandırılır. Bu, kaynak yoğun bir işlemin (ve bir nesne oluşturmak, kaynak yoğun bir işlemdir) önceden değil, talep üzerine gerçekleştirildiği programlama hilesidir. Peki Singleton Java kodumuzda aslında ne oluyor ? Yani nesnemiz önceden değil, erişildiği anda oluşturulur. Tembel başlatmanın bir şekilde Singleton modeline katı bir şekilde bağlı olduğunu varsaymamalısınız . Tembel başlatma, Proxy ve Fabrika Yöntemi gibi diğer yaratıcı tasarım modellerinde de kullanılır, ancak bu da başka bir hikaye =)
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION