it-swarm-id.com

Apa perbedaan antara semua metode statis dan penerapan pola tunggal?

Saya membuat database untuk menyimpan informasi tentang pengguna situs web saya (saya menggunakan stuts2 dan karenanya Java teknologi EE). Untuk database saya akan membuat DBManager. Haruskah saya menerapkan singleton pola di sini atau lebih tepatnya membuat semua metode itu statis?

Saya akan menggunakan DBManager ini untuk hal-hal dasar seperti menambah, menghapus, dan memperbarui profil Pengguna. Bersamaan dengan itu, saya akan menggunakan untuk semua tujuan permintaan lain, misalnya untuk mengetahui apakah nama pengguna sudah ada dan untuk mendapatkan semua pengguna untuk keperluan administrasi dan hal-hal seperti itu.

Pertanyaan saya

  • Apa manfaat dari pola tunggal?
  • Mana yang paling tepat di sini? Semua metode statis atau pola tunggal?
  • Silakan bandingkan keduanya.

P.S. Basis data lebih besar dari ini. Di sini saya hanya berbicara tentang tabel yang akan saya gunakan untuk menyimpan Informasi Pengguna.

28
shahensha

Mengapa Singleton dan metode statis satu-satunya pilihan Anda?

Dari sudut pandang saya, kedua opsi ini sangat buruk. Baca di Singleton AntiPattern . Sebagian besar kasus penggunaan Pola Singleton salah.

Dalam kasus Anda, saya akan menggunakan objek contoh dan menggunakan injeksi dependensi (jika Anda menggunakan kerangka kerja DI) atau pola pencari Lokasi/Registry

20
Tazzy531

Dengan kelas tunggal, Anda memiliki kontrol lebih besar dalam hal bagaimana Anda mengelola objek yang dibuat.

Pertama, singleton adalah objek. Metode statis mengembalikan instance objek dan memungkinkan Anda untuk membuat hanya instance tunggal, atau lebih jika Anda memilihnya.

Lajang juga malas, artinya mereka tidak dipakai sampai pertama kali mereka dipanggil.

Singleton tidak menggunakan metode statis, jadi Anda tidak akan kesulitan menggunakannya dalam konteks non-statis.

Lajang dapat diperpanjang/subklas.

Karena mereka objek, mereka dapat disuntikkan ke objek lain, yang memungkinkan terciptanya beberapa pola desain hebat menggunakan konsep injeksi ketergantungan. Misalnya, ini adalah cara kerja model Spring Bean IoC (Inversion of Control Dependency Injection).

15
jmort253

Tidak ada yang ideal, tetapi terutama tidak banyak statika. Inilah contoh dunia nyata dari pengalaman saya. Kami berbicara dengan database. Semua orang mengatakan "hanya akan ada satu", jadi seseorang menggunakan singleton standar yang dikonfigurasi oleh Spring. Lalu ada persyaratan baru yang ditambahkan: untuk dapat menyalin data kami ke basis data lain (jarak jauh). Ups. Karena kami memiliki Objek aktual yang mewakili DB, dan ini adalah fitur "jarang digunakan", saya bisa meretasnya dengan membuat salinan temporer dan mengubah bidang dan nilai, tetapi jika ini diterapkan dengan statika global, itu akan menjadi bencana nyata.

Dalam pengalaman saya, ketika "mereka" mengatakan bahwa hanya akan ada satu DB, satu pengguna, satu aplikasi, satu jendela utama, dll, "mereka" salah. Dengan Singlton, Anda setidaknya memiliki kesempatan untuk memperbaiki dan memperbaikinya.

3
user949300

Apa perbedaan antara semua metode statis dan penerapan pola tunggal?

Keduanya memiliki efek yang sama: Anda dapat memanggil metode kelas tanpa peduli bagaimana mendapatkan turunan dari kelas yang berisi metode tersebut.

Namun jika Anda ingin menerapkan metode statis Unittesting lebih bermasalah karena mereka tidak dapat dengan mudah diejek .

Dari perspektif pengujian, lebih mudah untuk menulis ulang kode yang menggunakan singelton untuk membuatnya tidak bisa dicemooh.

Soulution paling fleksibel adalah memiliki Dependency_injection tidak masalah jika Anda menggunakan kerangka kerja di-container (seperti yang disarankan oleh @ Tazzy531) atau jika Anda memasang dependensi berdasarkan kode.

3
k3b

Saya harap ini hanya akan menjawab pertanyaan utama di sini.

Sudah ada beberapa jawaban bagus di SO . Saya hanya akan mengutip mereka.

Jawaban terbaik, oleh Heinzi :

Singleton digunakan untuk memperkenalkan semacam keadaan global ke suatu aplikasi. Jika tidak bernegara, saya juga tidak melihat gunanya menggunakan singleton, kecuali

  • anda berharap untuk memperpanjangnya dengan status di masa mendatang atau
  • anda memerlukan instance objek untuk alasan tertentu teknis (misalnya, untuk pernyataan C # SyncLock, meskipun ini sudah cukup dibuat-buat) atau
  • anda memerlukan warisan, mis., Anda ingin dapat dengan mudah mengganti singleton Anda dengan yang lain menggunakan antarmuka yang sama tetapi implementasi yang berbeda. Sebagai contoh, metode Toolkit.getDefaultToolkit() dalam Java akan mengembalikan singleton yang tipe pastinya tergantung pada sistem.

Komentar relevan tinggi, oleh back2dos :

(...) lajang disalahgunakan untuk memperkenalkan negara-negara global. Tujuan dari lajang bukanlah untuk membuat objek tersedia secara global, tetapi untuk menegakkan bahwa objek hanya dipakai satu kali. Objek global adalah kejahatan yang perlu. Kecuali benar-benar diperlukan, seseorang harus mencoba untuk tidak menggunakannya, karena mereka umumnya mengarah pada kopling tinggi, dengan SomeSingleton.getInstance (). SomeMethod () di semua tempat.

tzaman juga menulis jawaban yang bagus:

Saya bisa melihat kasus untuk singleton tanpa kewarganegaraan yang digunakan daripada kelas metode statis, yaitu untuk Injeksi Ketergantungan .

Jika Anda memiliki kelas fungsi utilitas pembantu yang Anda gunakan secara langsung, itu menciptakan ketergantungan tersembunyi; Anda tidak memiliki kendali atas siapa yang dapat menggunakannya, atau di mana. Menyuntikkan kelas pembantu yang sama melalui instance singleton stateless memungkinkan Anda mengontrol di mana dan bagaimana itu digunakan, dan menggantinya/mengejeknya/dll ketika Anda perlu.

Menjadikannya sebagai singleton hanya memastikan bahwa Anda tidak mengalokasikan lebih banyak objek dari jenis yang diperlukan (karena Anda hanya membutuhkannya).

Dan akhirnya Sebastien juga menjawab sendiri dengan cukup baik:

Sebenarnya saya telah menemukan jawaban lain yang tidak disebutkan di sini: metode statis lebih sulit untuk diuji.

Tampaknya sebagian besar kerangka kerja uji bekerja bagus untuk mengejek metode contoh tetapi banyak dari mereka tidak tidak menangani dengan cara yang layak mengejek metode statis.

Yang sedang berkata, saya menyarankan menggunakan pola Toolbox .

2
cregox