Singleton deseni (tekil), uygulamada yalnızca bir örneği olan bir nesne oluşturma tekniğidir. Swift'te, statik özellikler ve thread güvenliği desteği ile bu desenin uygulanması kolaylaşmıştır.
Konu Tarihi:
Objective-C'de Singleton uygulaması, thread güvenliği ile ilgili uzun ve karmaşık bir kod gerektiriyordu. Swift'te bu sorun, statik özelliklerin tembel başlatılması sayesinde çözülmüştür.
Sorun:
Singleton genellikle uygulama durumuna merkezi erişim sağlamak için kullanılır (örneğin, Session, yapılandırmalar, servisler), ancak yanlış kullanımı, örtük bağımlılıklara ve kodun test edilebilirliğinin azalmasına neden olur.
Çözüm:
Swift'te desen, türünün statik sabiti aracılığıyla uygulanır. Bu, thread güvenliğini ve belirginliği garanti eder:
Kod örneği:
final class Logger { static let shared = Logger() private init() {} func log(_ message: String) { print(message) } } Logger.shared.log("Singleton çalışma örneği")
Anahtar özellikler:
Herhangi bir uygulama servisi için her zaman singleton kullanmak mümkün mü (ve gerekli mi)?
Hayır. Singleton, gerçekten küresel durumlar için (örneğin, ApplicationSettings) gerekçelidir, ancak iş mantığı servisleri için kullanılması yanlış: sıkı bağlantılara ve birim test problemlerine neden olur.
static let, Swift'te Singleton için thread güvenliğini garanti eder mi?
Evet, Swift 1.2'den itibaren (ve runtime mimarisi nedeniyle), static let doğası gereği thread-safe'dir — iş parçacıkları arasındaki rekabet durumunda bile bir kez başlatılır.
Singleton miras alınabilir mi?
Hayır. Mirası önlemek için sınıfı final olarak tanımlamak daha iyidir — aksi takdirde, farklı miras sınıflarının iki singleton örneğinin oluşması mümkün olur ve bu da desenin kendisini ihlal eder.
Ağ ile çalışmak için bir servis, singleton ile uygulandı ve yöntemler küresel durumu kullanıyor. Birim testlerinde örtük bir bağımlılık ortaya çıkıyor, servisi yeniden kullanmak mümkün olmuyor.
Artılar:
Eksiler:
Singleton, yalnızca gerçekten küresel bir varlık için kullanılır — örneğin, ApplicationConfig. Tüm servisler, açık bir enjektör aracılığıyla bağımlılıkları alır.
Artılar:
Eksiler: