Apa perbedaan nyata (yaitu praktis) yang ada antara kelas statis dan pola tunggal?
Keduanya dapat dipanggil tanpa instantiation, keduanya hanya menyediakan satu "Instance" dan tidak satu pun dari mereka yang aman. Apakah ada perbedaan lain?
design-patterns
static
singleton
Jorge Córdoba
sumber
sumber
getInstance()
metode setiap kali Anda ingin menggunakannya (walaupun mungkin dalam kebanyakan kasus itu tidak masalah ).singleton
objek di manastatic
metode hanya berfungsi, entitas non-OO.Jawaban:
Apa yang membuat Anda mengatakan bahwa metode tunggal atau statis tidak aman? Biasanya keduanya harus diimplementasikan agar aman.
Perbedaan besar antara singleton dan sekelompok metode statis adalah bahwa lajang dapat mengimplementasikan antarmuka (atau berasal dari kelas dasar yang berguna, meskipun menurut pengalaman saya), sehingga Anda dapat mengedarkan singleton seolah-olah itu "hanyalah " penerapan.
sumber
Foo
, dan Anda memiliki metode untuk mengambilFoo
sebagai parameter. Dengan pengaturan itu, penelepon dapat memilih untuk menggunakan singleton sebagai implementasinya - atau mereka dapat menggunakan implementasi yang berbeda. Metode ini dipisahkan dari singleton. Bandingkan dengan situasi di mana kelas hanya memiliki metode statis - setiap bagian dari kode yang ingin memanggil metode-metode tersebut secara erat digabungkan ke kelas, karena perlu menentukan kelas mana yang berisi metode statis.Jawaban yang benar adalah oleh Jon Skeet, di forum lain di sini .
sumber
interface
dengan kelas Singleton, tetapi metode statis kelas (atau misalnya C #static class
) tidak bisa.sumber
Pola Singleton memiliki beberapa keunggulan dibandingkan kelas statis. Pertama, singleton dapat memperluas kelas dan mengimplementasikan antarmuka, sementara kelas statis tidak bisa (itu dapat memperluas kelas, tetapi tidak mewarisi anggota contoh mereka). Singleton dapat diinisialisasi dengan malas atau asinkron sementara kelas statis umumnya diinisialisasi ketika pertama kali dimuat, yang mengarah ke masalah potensi loader kelas. Namun, keuntungan yang paling penting adalah bahwa lajang dapat ditangani secara polimorfik tanpa memaksa penggunanya untuk berasumsi bahwa hanya ada satu contoh.
sumber
static
kelas bukan untuk apa pun yang membutuhkan negara. Ini berguna untuk menyatukan banyak fungsi yaituMath
(atauUtils
dalam proyek). Jadi nama kelas hanya memberi kita petunjuk di mana kita dapat menemukan fungsi dan tidak lebih.Singleton
adalah pola favorit saya dan saya menggunakannya untuk mengelola sesuatu pada satu titik. Ini lebih fleksibel daripadastatic
kelas dan dapat mempertahankan keadaan itu. Itu dapat mengimplementasikan antarmuka, mewarisi dari kelas lain dan memungkinkan warisan.Aturan saya untuk memilih antara
static
dansingleton
:Jika ada banyak fungsi yang harus disimpan bersama, maka itu
static
adalah pilihan. Hal lain yang membutuhkan akses tunggal ke beberapa sumber daya, dapat diimplementasikan sebagaisingleton
.sumber
State
adalah kombinasi dari berbagai properti dari suatu objek yang biasanya berubah seiring waktu. Anda dapat Google untuk definisi formal.Kelas Statis: -
Anda tidak dapat membuat turunan dari kelas statis.
Dimuat secara otomatis oleh .NET Framework common language runtime (CLR) ketika program atau namespace yang mengandung kelas dimuat.
Kelas Statis tidak dapat memiliki konstruktor.
Kami tidak dapat meneruskan kelas statis ke metode.
Kami tidak dapat mewarisi kelas Statis ke kelas Statis lain di C #.
Kelas yang memiliki semua metode statis.
Performa yang lebih baik (metode statis terikat pada waktu kompilasi)
Singleton: -
Anda dapat membuat satu instance objek dan menggunakannya kembali.
Singleton instance dibuat untuk pertama kalinya ketika pengguna meminta.
Kelas singleton dapat memiliki konstruktor.
Anda bisa membuat objek kelas singleton dan meneruskannya ke metode.
Kelas singleton tidak menyebutkan batasan Warisan.
Kita dapat membuang objek dari kelas singleton tetapi tidak dari kelas statis.
Metode dapat diganti.
Dapat dimuat malas ketika perlu (kelas statis selalu dimuat).
Kami dapat mengimplementasikan antarmuka (kelas statis tidak dapat mengimplementasikan antarmuka).
sumber
Kelas statis adalah kelas yang hanya memiliki metode statis, yang kata yang lebih baik adalah "fungsi". Gaya desain yang terkandung dalam kelas statis adalah murni prosedural.
Singleton, di sisi lain, adalah pola khusus untuk desain OO. Ini adalah turunan dari sebuah objek (dengan semua kemungkinan yang melekat di dalamnya, seperti polimorfisme), dengan prosedur penciptaan yang memastikan bahwa hanya ada satu instance dari peran tertentu itu selama seumur hidupnya.
sumber
Dalam pola singleton Anda bisa membuat singleton sebagai turunan dari tipe turunan, Anda tidak bisa melakukannya dengan kelas statis.
Contoh cepat:
sumber
Untuk memperluas Jawaban Jon Skeet
Lajang lebih mudah digunakan ketika unit menguji sebuah kelas. Di mana pun Anda melewati lajang sebagai parameter (konstruktor, setter atau metode), Anda dapat mengganti versi singleton yang diejek atau di-stub.
sumber
MySingleton mockOfMySingleton = mock(MySingleton.class)
.new ClazzToTest(mockSingleton);
Inilah artikel yang bagus: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html
Kelas statis
tidak dapat menimpa metode, tetapi dapat menggunakan metode bersembunyi. ( Apa metode bersembunyi di Jawa? Bahkan penjelasan JavaDoc membingungkan )
Singleton
Singkatnya, saya hanya akan menggunakan kelas statis untuk memegang metode util, dan menggunakan Singleton untuk yang lainnya.
Suntingan
kelas statis juga dimuat dengan malas. Terima kasih @ jmoreno ( Kapan inisialisasi kelas statis terjadi? )
metode bersembunyi untuk kelas statis. Terima kasih @ MaxPeng.
sumber
Animal animal = new Cat();
kemudiananimal.foo();
apa yang terjadi?Keuntungan lain dari singleton adalah ia dapat dengan mudah diserialisasi, yang mungkin diperlukan jika Anda perlu menyimpan statusnya ke disk, atau mengirimnya ke suatu tempat dari jarak jauh.
sumber
Saya bukan ahli teori OO yang hebat, tetapi dari apa yang saya tahu, saya pikir satu-satunya fitur OO yang tidak dimiliki kelas statis dibandingkan dengan Singletons adalah polimorfisme. Tetapi jika Anda tidak membutuhkannya, dengan kelas statis tentu saja Anda dapat memiliki warisan (tidak yakin tentang implementasi antarmuka) dan enkapsulasi data dan fungsi.
Komentar Morendil, "Gaya desain yang terkandung dalam kelas statis adalah murni prosedural" Saya mungkin salah, tapi saya tidak setuju. Dalam metode statis Anda dapat mengakses anggota statis, yang akan persis sama dengan metode tunggal yang mengakses anggota contoh tunggal mereka.
sunting:
Saya sebenarnya berpikir sekarang bahwa perbedaan lain adalah bahwa kelas Static adalah instantiated saat program mulai * dan kehidupan sepanjang rentang kehidupan seluruh program, sementara tunggal secara eksplisit dipakai di beberapa titik dan bisa hancur juga.
* atau mungkin dipakai pada penggunaan pertama, tergantung pada bahasa, saya pikir.
sumber
Untuk mengilustrasikan poin Jon, apa yang ditunjukkan di bawah ini tidak dapat dilakukan jika Logger adalah kelas statis. Kelas
SomeClass
mengharapkan instance dariILogger
implementasi untuk diteruskan ke konstruktornya.Kelas singleton penting untuk injeksi ketergantungan menjadi mungkin.
sumber
Yah seorang singleton hanyalah kelas normal yang IS dipakai tetapi hanya sekali dan tidak langsung dari kode klien. Kelas statis tidak dipakai. Sejauh yang saya tahu metode statis (kelas statis harus memiliki metode statis) lebih cepat daripada non-statis.
Sunting:
Uraian aturan kinerja FxCop: "Metode yang tidak mengakses data instance atau metode instance panggilan dapat ditandai sebagai statis (Dibagikan dalam VB). Setelah melakukannya, kompiler akan memancarkan situs panggilan non-virtual kepada anggota ini yang akan mencegah periksa saat runtime untuk setiap panggilan yang mengasuransikan pointer objek saat ini adalah non-null. Ini dapat menghasilkan peningkatan kinerja yang terukur untuk kode yang sensitif terhadap kinerja. Dalam beberapa kasus, kegagalan untuk mengakses instance objek saat ini merupakan masalah kebenaran. "
Saya sebenarnya tidak tahu apakah ini berlaku juga untuk metode statis di kelas statis.
sumber
Singleton's instantiated, hanya saja hanya ada satu instantiated, maka single di Singleton.
Kelas statis tidak dapat dipakai oleh apa pun selain dirinya sendiri.
sumber
Perbedaan utama adalah:
sumber
Singleton adalah pendekatan yang lebih baik dari perspektif pengujian. Tidak seperti kelas statis, singleton dapat mengimplementasikan antarmuka dan Anda dapat menggunakan contoh tiruan dan menyuntikkan mereka.
Dalam contoh di bawah ini saya akan menggambarkan ini. Misalkan Anda memiliki metode isGoodPrice () yang menggunakan metode getPrice () dan Anda menerapkan getPrice () sebagai metode dalam singleton.
singleton yang menyediakan fungsionalitas getPrice:
Penggunaan getPrice:
Implementasi Final Singleton:
kelas tes:
Jika kita mengambil alternatif menggunakan metode statis untuk mengimplementasikan getPrice (), sulit untuk mengejek getPrice (). Anda dapat mengejek statis dengan mengejek listrik, namun tidak semua produk dapat menggunakannya.
sumber
Saya setuju dengan definisi ini:
Anda dapat menemukan perbedaan menarik lainnya tentang: Singleton Pattern Versus Static Class
sumber
Satu perbedaan penting adalah instantiasi berbeda yang datang dengan Singletons.
Dengan kelas statis, itu akan dibuat oleh CLR dan kami belum mengontrolnya. dengan lajang, objek akan dipakai pada instance pertama yang mencoba diakses.
sumber
Dalam banyak kasus, keduanya tidak memiliki perbedaan praktis, terutama jika instance tunggal tidak pernah berubah atau berubah sangat lambat misalnya memegang konfigurasi.
Saya akan mengatakan perbedaan terbesar adalah singleton masih Java Bean normal dibandingkan dengan kelas Java khusus statis. Dan karena ini, seorang lajang diterima dalam lebih banyak situasi; itu sebenarnya adalah strategi instantiation Spring Framework default. Konsumen mungkin atau mungkin tidak tahu itu singleton yang diedarkan, itu hanya memperlakukannya seperti kacang Jawa biasa. Jika perubahan kebutuhan dan singleton perlu menjadi prototipe, seperti yang sering kita lihat di Spring, itu dapat dilakukan dengan mulus tanpa garis kode berubah ke konsumen.
Orang lain telah menyebutkan sebelumnya bahwa kelas statis harus murni prosedural misalnya java.lang.Math. Dalam pikiranku, kelas seperti itu seharusnya tidak pernah diedarkan dan mereka tidak boleh memiliki apa pun selain final statis sebagai atribut. Untuk yang lainnya, gunakan singleton karena jauh lebih fleksibel dan lebih mudah dirawat.
sumber
Kami memiliki kerangka kerja DB kami yang membuat koneksi ke Back end. Untuk Menghindari Dirty membaca di beberapa pengguna, kami telah menggunakan pola tunggal untuk memastikan kami memiliki satu instance tersedia pada setiap titik waktu.
Di c # kelas statis tidak dapat mengimplementasikan antarmuka. Ketika kelas instance tunggal perlu mengimplementasikan antarmuka untuk kontrak bisnis atau tujuan IoC, ini adalah tempat saya menggunakan pola Singleton tanpa kelas statis
Singleton menyediakan cara untuk mempertahankan status dalam skenario stateless
Semoga itu bisa membantu Anda ..
sumber
sumber
Sebuah. Serialisasi - Anggota statis adalah anggota kelas dan karenanya tidak dapat diserialisasi.
b. Meskipun kami telah menjadikan konstruktor sebagai pribadi, variabel anggota statis masih akan dibawa ke subkelas.
c. Kami tidak dapat melakukan inisialisasi malas karena semuanya akan dimuat pada pemuatan kelas saja.
sumber
Dari perspektif klien, perilaku statis diketahui oleh klien tetapi perilaku Singleton dapat diselesaikan tersembunyi dari klien. Klien mungkin tidak pernah tahu bahwa hanya ada satu instance yang dia mainkan berulang kali.
sumber
Saya membaca yang berikut ini dan berpikir itu masuk akal juga:
dari buku Objected-Oriented Thought Process 4th Ed.
sumber
Dalam sebuah artikel yang saya tulis saya telah menjelaskan sudut pandang saya tentang mengapa singleton jauh lebih baik daripada kelas statis:
sumber
Kita dapat membuat objek kelas singleton dan meneruskannya ke metode.
Kelas singleton tidak membatasi waris.
Kita tidak bisa membuang objek dari kelas statis tetapi bisa kelas singleton.
sumber
Perbedaan dari kelas statis
JDK memiliki contoh singleton dan static, di satu sisi
java.lang.Math
adalah kelas final dengan metode statis, di sisi lainjava.lang.Runtime
adalah kelas singleton.Keuntungan dari singleton
Jika kebutuhan Anda untuk mempertahankan status daripada pola tunggal adalah pilihan yang lebih baik daripada kelas statis, karena mempertahankan status di kelas statis mengarah ke bug, terutama di lingkungan bersamaan, yang dapat menyebabkan kondisi balapan tanpa sinkronisasi paralel modifikasi yang memadai oleh beberapa utas.
Kelas singleton dapat dimuat dengan malas jika merupakan objek yang berat, tetapi kelas statis tidak memiliki kelebihan seperti itu dan selalu bersemangat dimuat.
Dengan singleton, Anda dapat menggunakan pewarisan dan polimorfisme untuk memperluas kelas dasar, mengimplementasikan antarmuka dan menyediakan implementasi yang berbeda.
Karena metode statis di Java tidak dapat ditimpa, metode ini menyebabkan tidak fleksibel. Di sisi lain, Anda bisa mengganti metode yang didefinisikan dalam kelas singleton dengan memperluasnya.
Kekurangan dari kelas statis
Keuntungan dari kelas statis
Ada beberapa realisasi pola tunggal masing-masing dengan kelebihan dan kekurangan.
Deskripsi mendetail masing-masing dari mereka terlalu bertele-tele jadi saya hanya menaruh tautan ke artikel yang bagus - Yang ingin Anda ketahui tentang Singleton
sumber
Ada perbedaan besar antara instance kelas statis tunggal (yaitu, satu instance kelas, yang merupakan variabel statis atau global) dan satu pointer statis tunggal ke instance kelas di heap:
Ketika aplikasi Anda keluar, destruktor instance kelas statis akan dipanggil. Itu berarti jika Anda menggunakan contoh statis itu sebagai singleton, singleton Anda berhenti bekerja dengan benar. Jika masih ada kode yang berjalan yang menggunakan singleton itu, misalnya di utas yang berbeda, kode itu kemungkinan besar akan mogok.
sumber
Perbedaan di kepala saya adalah menerapkan pemrograman berorientasi objek (Singleton / Prototipe) atau pemrograman fungsional (Statis).
Kita terlalu fokus pada jumlah objek yang diciptakan oleh pola singleton ketika apa yang harus kita fokuskan adalah pada akhirnya kita memegang suatu objek. Seperti yang telah dikatakan orang lain, ini dapat diperluas, diteruskan sebagai parameter tetapi yang paling penting adalah keadaan penuh.
Di sisi lain statis digunakan untuk mengimplementasikan pemrograman fungsional. Anggota statis milik kelas. Mereka tanpa kewarganegaraan.
Omong-omong, apakah Anda tahu bahwa Anda dapat membuat kelas statis tunggal :)
sumber