Saya telah membaca berbagai pendapat tentang pola singleton. Beberapa berpendapat bahwa itu harus dihindari dengan cara apa pun dan yang lain itu dapat berguna dalam situasi tertentu.
Satu situasi di mana saya menggunakan lajang adalah ketika saya membutuhkan sebuah pabrik (katakanlah objek f dari tipe F) untuk membuat objek dari kelas tertentu A. Pabrik dibuat sekali menggunakan beberapa parameter konfigurasi dan kemudian digunakan setiap kali objek dari tipe A dipakai. Jadi setiap bagian dari kode yang ingin instantiate A mengambil singleton f dan membuat instance baru, misalnya
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Jadi secara umum skenario saya adalah itu
- Saya hanya perlu satu instance kelas baik untuk alasan optimasi (saya tidak perlu beberapa objek pabrik) atau untuk berbagi keadaan umum (mis. Pabrik tahu berapa banyak instance A yang masih dapat dibuat)
- Saya perlu cara untuk memiliki akses ke instance F ini di tempat kode yang berbeda.
Saya tidak tertarik pada diskusi apakah pola ini baik atau buruk, tetapi dengan asumsi saya ingin menghindari penggunaan singleton, pola apa lagi yang bisa saya gunakan?
Gagasan yang saya miliki adalah (1) untuk mendapatkan objek pabrik dari registri atau (2) untuk membuat pabrik di beberapa titik selama program dimulai dan kemudian melewati pabrik sebagai parameter.
Dalam solusi (1), registri itu sendiri adalah singleton, jadi saya baru saja menggeser masalah tidak menggunakan singleton dari pabrik ke registri.
Dalam kasus (2) saya memerlukan beberapa sumber awal (objek) dari mana objek pabrik berasal sehingga saya takut bahwa saya akan kembali ke singleton lain (objek yang menyediakan contoh pabrik saya). Dengan mengikuti kembali rantai lajang ini saya mungkin dapat mengurangi masalah menjadi satu lajang (seluruh aplikasi) dimana semua lajang lainnya dikelola secara langsung atau tidak langsung.
Apakah opsi terakhir ini (menggunakan satu singleton awal yang menciptakan semua objek unik lainnya dan menyuntikkan semua lajang lainnya di tempat yang tepat) menjadi solusi yang dapat diterima? Apakah ini solusi yang disarankan secara implisit ketika seseorang menyarankan untuk tidak menggunakan lajang, atau apa solusi lain, misalnya dalam contoh yang diilustrasikan di atas?
EDIT
Karena saya pikir pertanyaan saya telah disalahpahami oleh beberapa orang, berikut adalah beberapa informasi. Seperti yang dijelaskan misalnya di sini , kata singleton dapat menunjukkan (a) kelas dengan objek instance tunggal dan (b) pola desain yang digunakan untuk membuat dan mengakses objek tersebut.
Untuk memperjelas sesuatu, mari kita gunakan istilah objek unik untuk (a) dan pola tunggal untuk (b). Jadi, saya tahu apa pola singleton dan injeksi ketergantungan (BTW, akhir-akhir ini saya banyak menggunakan DI untuk menghapus instance dari pola singleton dari beberapa kode yang saya kerjakan).
Maksud saya adalah bahwa kecuali seluruh grafik objek adalah instantiated dari satu objek yang hidup pada tumpukan metode utama, akan selalu ada kebutuhan untuk mengakses beberapa objek unik melalui pola singleton.
Pertanyaan saya adalah apakah memiliki pembuatan grafik lengkap dan pengkabelan bergantung pada metode utama (misalnya melalui beberapa kerangka DI yang kuat yang tidak menggunakan pola itu sendiri) adalah satu-satunya solusi bebas pola tunggal .