JavaRush /Blog Java /Random-MS /Corak dan Singleton - untuk semua orang yang menemuinya b...

Corak dan Singleton - untuk semua orang yang menemuinya buat kali pertama

Diterbitkan dalam kumpulan
Artikel ini ditujukan kepada mereka yang pertama kali menemui konsep corak, mendengar tentang Singleton'e, atau entah bagaimana membuatnya, tetapi masih tidak memahami apa-apa. Selamat datang! Pelajar JavaRush menemui corak buat kali pertama pada tahap 15, apabila secara tidak dijangka topi meminta untuk "membetulkan" dan melaksanakan corak Singletondengan pelaksanaan yang malas. Pelajar yang pertama kali mendengar tentangnya Singletonserta-merta mempunyai banyak soalan: apakah corak, mengapa ia diperlukan, corak jenis apakah itu, Singletondan akhirnya, jenis pelaksanaan yang malas ini. Mari mulakan menjawab mengikut urutan: Corak dan Singleton - untuk semua orang yang menemuinya buat kali pertama - 1

Apakah corak pula?

Untuk pemahaman yang lebih baik, saya fikir ia berbaloi untuk menjawab soalan dari sejarah ini. Di antara pengaturcara terdapat empat pengarang yang terkenal: Erich Gamma, Richard Helm, Ralph Johnson dan John Vlissides, yang menghasilkan idea yang menarik.
Corak dan Singleton - untuk semua orang yang menemuinya buat kali pertama - 2
Mereka menyedari bahawa apabila menulis program mereka sering perlu menyelesaikan masalah yang lebih kurang sama dan menulis kod jenis yang sama dalam struktur. Oleh itu, mereka memutuskan untuk menerangkan dalam bentuk corak corak tipikal yang sering digunakan dalam pengaturcaraan berorientasikan objek. Buku ini diterbitkan pada tahun 1995 di bawah tajuk “Teknik Reka Bentuk Berorientasikan Objek. Corak Rekaan" . Tajuk buku itu ternyata terlalu panjang, dan ia dikenali sebagai The Book of the Gang of Four . Dalam edisi pertama, 23 corak telah diterbitkan, selepas itu berpuluh-puluh yang lain ditemui. Jadi, menjawab soalan dalam perenggan ini, "Apakah corak?" , mari ringkaskan dalam beberapa perkataan sahaja:
Corak ialah penyelesaian piawai kepada masalah biasa.
Dan Singletonini hanyalah salah satu daripada corak ini.

Mengapa kita memerlukan corak (corak reka bentuk)

Anda boleh memprogram tanpa mengetahui corak; anda boleh mengesahkan ini hanya dengan menyedari hakikat bahawa pada tahap ke-15 di JavaRush anda telah menulis beratus-ratus program mini tanpa mengetahui apa-apa tentang kewujudannya. Ini menunjukkan bahawa corak adalah sejenis alat, kehadirannya membezakan tuan dari amatur:
Corak dan Singleton - untuk semua orang yang menemuinya buat kali pertama - 3
Corak menerangkan cara menyelesaikan salah satu masalah biasa dengan betul. Akibatnya, mengetahui corak menjimatkan masa anda. Analogi boleh dibuat dengan algoritma. Sebagai contoh, anda boleh menghasilkan algoritma pengisihan anda sendiri dengan blackjack dan nombor dan menghabiskan banyak masa padanya, atau anda boleh menggunakan algoritma yang telah diterangkan lama dahulu dan melaksanakannya. Ia sama dengan corak. Selain itu, dengan penggunaan corak, kod menjadi lebih piawai, dan apabila menggunakan corak yang betul, anda akan kurang berkemungkinan melakukan kesilapan, kerana ia telah diramalkan dan dihapuskan dalam corak ini. Nah, ditambah dengan segala-galanya, pengetahuan tentang corak membolehkan pengaturcara memahami satu sama lain dengan lebih baik. Sekadar menyebut nama templat sudah memadai, bukannya cuba menerangkan kepada rakan pengaturcara anda apa yang anda mahu mereka lakukan. Jadi, untuk meringkaskan, corak reka bentuk membantu:
  • jangan cipta semula roda, tetapi gunakan penyelesaian standard;
  • menyeragamkan kod;
  • menyeragamkan istilah;
Sebagai kesimpulan bahagian ini, kami perhatikan bahawa keseluruhan pelbagai corak boleh dipermudahkan kepada tiga kumpulan besar:
Corak dan Singleton - untuk semua orang yang menemuinya buat kali pertama - 4

Akhirnya corak Singleton

Singletonmerujuk kepada corak generatif . Terjemahan literalnya lebih menyendiri. Corak ini memastikan bahawa kelas hanya mempunyai satu objek (satu contoh kelas) dan titik capaian global disediakan kepada objek itu. Ia harus jelas daripada huraian bahawa corak ini harus digunakan dalam dua kes:
  1. apabila tidak lebih daripada satu objek mana-mana kelas harus dibuat dalam program anda. Sebagai contoh, dalam permainan komputer anda mempunyai kelas "Watak", dan kelas ini harus mempunyai hanya satu objek yang menerangkan watak itu sendiri.

  2. apabila anda perlu menyediakan pusat akses global kepada objek kelas. Dalam erti kata lain, anda perlu memastikan bahawa objek dipanggil dari mana-mana sahaja dalam program. Dan, malangnya, untuk ini tidak cukup untuk hanya mencipta pembolehubah global, kerana ia tidak dilindungi tulis dan sesiapa sahaja boleh menukar nilai pembolehubah ini dan titik capaian global kepada objek akan hilang. Ciri-ciri ini Singletondiperlukan, sebagai contoh, apabila anda mempunyai objek kelas yang berfungsi dengan pangkalan data, dan anda memerlukan pangkalan data boleh diakses dari bahagian-bahagian program yang berlainan. Dan Singletonia akan menjamin bahawa tiada kod lain telah menggantikan contoh kelas yang dibuat sebelum ini.
Kedua-dua masalah ini diselesaikan dengan Singleton: mesti ada hanya satu objek dalam program dan mesti ada akses global kepadanya. Dalam contoh pada tahap 15, topi meminta untuk melaksanakan corak ini untuk tugasan berikut (ini ialah penerangannya):
Corak dan Singleton - untuk semua orang yang menemuinya buat kali pertama - 5
Selepas membaca syarat dengan teliti, ia menjadi jelas mengapa betul-betul Singleton(Bujang) diperlukan di sini. Lagipun, program ini meminta anda membuat satu objek bagi setiap kelas: Sun, Moon, Earth. Dan adalah logik untuk mengandaikan bahawa setiap kelas dalam program harus mencipta tidak lebih daripada satu Matahari/Bulan/Bumi, jika tidak, ia akan menjadi tidak masuk akal, melainkan sudah tentu anda menulis versi Star Wars anda sendiri. Ciri pelaksanaan SingletonJava dalam tiga langkah Tingkah laku Singleton dalam Java tidak boleh dilaksanakan menggunakan pembina biasa kerana pembina sentiasa mengembalikan objek baharu. Oleh itu, semua pelaksanaan Singleton'a turun untuk menyembunyikan pembina dan mencipta kaedah statik awam yang akan mengawal kewujudan objek tunggal dan "memusnahkan" semua objek yang baru muncul. Jika Singleton'a dipanggil, ia mesti sama ada mencipta objek baharu (jika ia belum ada dalam program) atau mengembalikan objek yang telah dibuat. Untuk melakukan ini: #1. – Anda perlu menambah medan statik peribadi ke kelas yang mengandungi satu objek:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – Jadikan pembina kelas (pembina lalai) peribadi (supaya akses kepadanya ditutup di luar kelas, maka ia tidak akan dapat mengembalikan objek baharu):
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#3 . – Isytihar kaedah penciptaan statik yang akan digunakan untuk mendapatkan singleton:
public class LazyInitializedSingleton {
    private static LazyInitializedSingleton instance;
        private LazyInitializedSingleton(){}
        public static LazyInitializedSingleton getInstance(){ // #3
        if(instance == null){		//if the object has not been created yet
            instance = new LazyInitializedSingleton();	//create a new object
        }
        return instance;		// return the previously created object
    }
}
Contoh di atas agak kekok, kerana kita hanya menyembunyikan pembina dan menyediakan kaedah kita sendiri dan bukannya pembina standard. Memandangkan artikel ini bertujuan untuk membolehkan pelajar JavaRush berhubung dengan corak ini (dan corak secara umum) buat kali pertama, ciri pelaksanaan Singleton yang lebih kompleks tidak akan diberikan di sini. Kami hanya ambil perhatian bahawa bergantung pada kerumitan program, penambahbaikan yang lebih terperinci bagi corak ini mungkin diperlukan. Contohnya, dalam persekitaran berbilang benang (lihat topik Benang), beberapa utas berbeza boleh memanggil kaedah pengambil Singleton secara serentak dan kod yang diterangkan di atas akan berhenti berfungsi, kerana setiap utas individu akan dapat mencipta berbilang kejadian kelas sekaligus. Oleh itu, masih terdapat beberapa pendekatan berbeza untuk mencipta singleton selamat Benang yang betul. Tapi itu cerita lain =) Dan akhirnya. Apakah itu Lazy Initialization yang diminta oleh cap ? Lazy Initialization juga dipanggil lazy initialization. Ini ialah teknik pengaturcaraan di mana operasi intensif sumber (dan mencipta objek ialah operasi intensif sumber) dilakukan atas permintaan, bukannya terlebih dahulu. Yang pada asasnya adalah apa yang berlaku dalam kod kami Singleton'a. Dalam erti kata lain, objek kita dicipta pada masa ia diakses, dan bukan terlebih dahulu. Ia tidak boleh diandaikan bahawa konsep permulaan malas entah bagaimana berkait rapat dengan Singleton'om. Inisialisasi malas juga digunakan dalam corak reka bentuk generatif lain, contohnya dalam Kaedah Proksi dan Kilang, tetapi itu cerita lain =) Sumber berikut digunakan dalam menyediakan artikel:
  1. Amalan Terbaik Corak Reka Bentuk Java Singleton dengan Contoh
  2. Corak Rekaan
  3. Betul Singleton di Jawa
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION