Yardımcı / yardımcı sınıflar hakkındaki bu basit sorulara hiçbir zaman iyi cevaplar bulamadım:
Neden statik yöntemler kullanmak yerine tekli (durumsuz) oluşturayım?
Bir nesnenin durumu yoksa neden bir nesne örneğine ihtiyaç duyulur?
Yardımcı / yardımcı sınıflar hakkındaki bu basit sorulara hiçbir zaman iyi cevaplar bulamadım:
Neden statik yöntemler kullanmak yerine tekli (durumsuz) oluşturayım?
Bir nesnenin durumu yoksa neden bir nesne örneğine ihtiyaç duyulur?
Yanıtlar:
Genellikle, bir uygulamaya bir tür küresel durumu tanıtmak için tek tonlar kullanılır . (Dürüst olmak gerekirse, gerçekten gerekenden daha sık, ama bu başka bir zaman için bir konu.)
Ancak, devletsiz bir bekarın bile yararlı olabileceği birkaç köşe durumu vardır :
locksynchronizedToolkit.getDefaultToolkit()Java'daki yöntem, tam türü sisteme bağlı olan bir tekli döndürür.DBNull.ValueStatik yöntemler sınıfı, yani Bağımlılık Enjeksiyonu yerine durumsuz bir singleton kullanıldığını görebiliyordum .
Doğrudan kullandığınız yardımcı bir yardımcı sınıf işlevlerine sahipseniz, bu gizli bir bağımlılık oluşturur; onu kimin veya nerede kullanabileceği konusunda hiçbir kontrole sahip değilsiniz. Aynı yardımcı sınıfın durum bilgisi olmayan bir tekil örnek aracılığıyla enjekte edilmesi, nerede ve nasıl kullanıldığını kontrol etmenize ve gerektiğinde değiştirmenize / alay etmenize / vb. Olanak tanır.
Bunu tekil örnek yapmak basitçe, gerekli olandan daha fazla türde nesneyi ayırmamanızı sağlar (çünkü yalnızca bir tanesine ihtiyacınız vardır).
Aslında burada belirtilmeyen başka bir cevap buldum: statik yöntemlerin test edilmesi daha zordur.
Çoğu test çerçevesi, örnek yöntemlerle alay etmek için harika çalışıyor, ancak çoğu statik yöntemlerin taklidini düzgün bir şekilde ele almıyor.
Çoğu programlama dilinde sınıflar pek çok tip sistemi atlatır. Statik yöntemleri ve değişkenleriyle bir sınıf bir nesne olsa da, çoğu zaman bir arabirim uygulayamaz veya diğer sınıfları genişletemez. Bu nedenle, başka bir türün alt tipi olamayacağı için polimorfik bir şekilde kullanılamaz. Bir arabirim varsa, örneğin, IFooablediğer sınıfları birçok yöntem imzalarla gereklidir, sınıf nesnesi StaticFooyerine kullanılamaz IFooableise, FooSingleton.getInstance()kutu (varsayılarak FooSingletonuygular IFooable).
Lütfen unutmayın, Heinzi'nin cevabına yorum yaptığım gibi, bir tekil, somutlaştırmayı kontrol etmek için bir modeldir. Yazarına veren new Class()ile değiştirilirClass.getInstance()Class , gereksiz örneklerin oluşturulmasını önlemek için kullanabileceği örnekler üzerinde daha fazla kontrol . Tekli, fabrika modelinin çok özel bir durumudur ve bu şekilde ele alınmalıdır. Yaygın kullanım, bunu daha ziyade küresel kayıtların özel bir durumu haline getirir, bu da genellikle kötü sonuçlanır, çünkü küresel kayıtlar sadece isteyerek kullanılmamalıdır.
Genel yardımcı işlevler sağlamayı planlıyorsanız, statik yöntemler iyi çalışacaktır. Sınıf, sınıf olarak değil, sadece bir ad alanı olarak hareket edecektir. Size yüksek uyumu korumanızı öneririm, yoksa en tuhaf çiftleşme sorunları yaşayabilirsiniz.
greetz
back2dos
Hangisini kullanmak arasında bir değiş tokuş var. Tekillerin durumu olabilir veya olmayabilir ve nesnelere atıfta bulunurlar. Durumu korumuyorlarsa ve yalnızca genel erişim için kullanılıyorlarsa, bu yöntemler daha hızlı olacağından statik daha iyidir. Ancak nesneleri ve OOP kavramlarını (Kalıtım polimorfizmi) kullanmak istiyorsanız, o zaman singleton daha iyidir.
Bir örnek düşünün: java.lang.Runtime, java'da bir singleton sınıfıdır. Bu sınıf, her JVM için farklı uygulamalara izin verir. Uygulama, JVM başına tekdir. Bu sınıf statik olsaydı, JVM'ye dayalı farklı uygulamaları geçemeyiz.
Bu bağlantıyı gerçekten yararlı buldum: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?
Umarım yardımcı olur!!
Benim için "Nesne Durumunun Singleton kullanmasını istiyorum, İstenen Fonksiyonun statik yöntemi kullanmasını istiyorum"
Ne istediğine bağlı. Nesne durumunu istediğinizde (örneğin null, yerine Null durumu gibi Polimorfizm veya varsayılan durum), tekli sizin için uygun seçimdir, oysa statik yöntem işleve ihtiyaç duyduğunuzda kullanılır (Girişleri al ve sonra bir çıktı döndür).
Tekil durum için tavsiye ederim, somutlaştırıldıktan sonra her zaman aynı durumda olmalıdır. Klonlanabilir olmamalı ve ayarlanacak herhangi bir değer almamalıdır (dosyadan statik yapılandırma hariç, örneğin java'daki özellikler dosyası).
Not: Bu ikisi arasındaki performans milisaniye cinsinden farklıdır, bu nedenle önce Mimariye odaklanın .
Singleton vatansız değil, küresel durumu elinde tutuyor.
Singleton kullanmayı düşünebileceğim bazı nedenler: