CodeGym /Blog Java /rawak /Corak dan Singleton di Jawa
John Squirrels
Tahap
San Francisco

Corak dan Singleton di Jawa

Diterbitkan dalam kumpulan
Artikel ini ditujukan kepada sesiapa sahaja yang, buat kali pertama, menghadapi konsep corak reka bentuk, pernah mendengar istilah singleton , atau entah bagaimana melaksanakan corak singleton tetapi tidak memahami apa yang berlaku. Selamat datang! Pelajar CodeGym menemui corak reka bentuk buat kali pertama pada Tahap 15, apabila kapten secara tidak dijangka meminta mereka untuk "mengukuhkan" pemahaman mereka dengan melaksanakan corak Java Singleton dengan pelaksanaan yang malas. Pelajar yang mendengar tentang corak singleton buat kali pertama serta-merta mempunyai banyak soalan: apakah di dunia corak reka bentuk? Mengapa kita memerlukannya? Apa itu singleton ? Dan akhirnya, apakah pelaksanaan yang malas? Mari jawab soalan-soalan ini mengikut urutan.

Apakah corak reka bentuk di dunia?

Saya percaya sedikit sejarah adalah untuk menjawab soalan ini dengan pemahaman yang terbaik. Terdapat empat pengarang pengaturcaraan terkenal (Erich Gamma, John Vlissides, Ralph Johnson, dan Richard Helm) yang menghasilkan idea yang menarik. Mereka menyedari bahawa pembangunan perisian sering memerlukan mereka menyelesaikan masalah yang lebih kurang sama dan menulis kod berstruktur dengan cara yang sama. Jadi mereka memutuskan untuk menerangkan corak tipikal yang sering perlu digunakan dalam pengaturcaraan berorientasikan objek. Buku mereka diterbitkan pada tahun 1994 di bawah tajuk Design Patterns: Elements of Reusable Object-Oriented Software. Nama buku itu ternyata terlalu panjang dan orang ramai mula memanggilnya dengan mudah sebagai buku oleh Geng Empat. Edisi pertama termasuk 23 corak. Selepas itu, berpuluh-puluh corak lain ditemui.
Corak reka bentuk ialah penyelesaian piawai kepada masalah biasa.
Dan corak singleton hanyalah salah satu daripadanya.

Mengapa kita memerlukan corak reka bentuk?

Anda boleh memprogram tanpa mengetahui corak: lagipun, menjelang Tahap 15, anda telah menulis ratusan program mini di CodeGym tanpa mengetahui bahawa ia wujud. Ini menunjukkan bahawa corak reka bentuk ialah sejenis alat yang penggunaannya membezakan master daripada amatur: Corak reka bentuk menerangkan cara menyelesaikan masalah biasa dengan betul. Ini bermakna mengetahui corak menjimatkan masa anda. Dengan cara itu, mereka serupa dengan algoritma. Sebagai contoh, anda boleh mencipta algoritma pengisihan anda sendiri dengan blackjack dan nombordan menghabiskan banyak masa berbuat demikian, atau anda boleh melaksanakan satu yang telah difahami dan diterangkan untuk masa yang lama. Begitu juga dengan corak reka bentuk. Selain itu, dengan corak reka bentuk, kod menjadi lebih standard dan apabila menggunakan corak yang sesuai, anda kurang berkemungkinan melakukan kesilapan, memandangkan perangkap biasa corak telah dikenal pasti dan dihapuskan sejak dahulu lagi. Selain daripada segala-galanya, pengetahuan tentang corak membantu pengaturcara memahami satu sama lain dengan lebih baik. Anda hanya boleh menyebut nama corak sebaliknya cuba memberikan penjelasan panjang lebar kepada rakan pengaturcara anda. Kesimpulannya, corak reka bentuk membantu anda:
  • bukan mencipta semula roda, tetapi sebaliknya gunakan penyelesaian standard;
  • menyeragamkan kod;
  • menyeragamkan istilah;
Untuk menyimpulkan bahagian ini, kami perhatikan bahawa keseluruhan badan corak reka bentuk boleh dibahagikan kepada tiga kumpulan besar: Corak dan singleton - untuk semua orang yang menemuinya buat kali pertama - 2

Akhirnya, corak tunggal

Singleton ialah corak ciptaan . Corak ini memastikan bahawa terdapat hanya satu contoh kelas dan menyediakan pusat akses global untuk objek ini. Daripada huraian, harus jelas bahawa corak ini harus digunakan dalam dua kes:
  1. apabila program anda memerlukan tidak lebih daripada satu objek kelas tertentu harus dicipta. Sebagai contoh, permainan komputer mungkin mempunyai kelas Hero dan hanya satu objek Hero yang menerangkan wira tunggal dalam permainan itu.

  2. apabila anda perlu menyediakan titik untuk akses global kepada objek. Dengan kata lain, anda perlu menyediakan objek dari mana-mana sahaja dalam program. Malangnya, tidak cukup dengan hanya mencipta pembolehubah global, kerana ia tidak dilindungi tulis: sesiapa sahaja boleh menukar nilai pembolehubah, jadi titik capaian global objek mungkin hilang. Ciri-ciri Singleton ini adalah perlu, sebagai contoh, apabila anda mempunyai objek yang berfungsi dengan pangkalan data, dan anda perlu mengakses pangkalan data dari bahagian program yang berlainan. Singleton akan memastikan tiada sesiapa yang menulis kod yang menggantikan contoh yang dibuat sebelum ini.
Jadi Singleton memenuhi dua keperluan ini: mesti ada hanya satu daripada jenis objek tertentu dalam program dan mesti ada akses global kepadanya. Dalam contoh di Tahap 15, kapten meminta anda untuk melaksanakan corak ini untuk tugasan berikut:
  1. Cari contoh Singleton dengan permulaan malas.

  2. Cipta tiga kelas tunggal — Matahari, Bulan, Bumi — dalam fail berasingan menggunakan prinsip yang sama.

  3. LaksanakanPlanetantara muka dalam kelas Matahari , Bulan dan Bumi .

  4. Dalam blok statik kelas Penyelesaian panggilbacaKeyFromConsoleAndInitPlanetkaedah.

  5. MelaksanakanbacaKeyFromConsoleAndInitPlanetfungsi kaedah:

    • 5.1. Baca satu parameter Rentetan daripada konsol

    • 5.2. Jika parameter adalah sama dengan salah satu daripadaPlanetpemalar antara muka, cipta objekPlanet yang sesuai .

Selepas membaca syarat tugas dengan teliti, kita dapat melihat dengan jelas mengapa Singleton diperlukan di sini. Sesungguhnya, kami diminta untuk membuat contoh bagi setiap kelas berikut: Matahari , Bulan , Bumi . Masuk akal untuk mengandaikan bahawa kita harus mencipta tidak lebih daripada satu Matahari/Bulan/Bumi. Jika tidak, kita akan menghadapi situasi yang tidak masuk akal, melainkan sudah tentu anda menulis versi Star Wars anda. Melaksanakan corak Singleton di Jawa dalam tiga langkah Di Jawa, tingkah laku Singleton tidak boleh dilaksanakan menggunakan pembina biasa, kerana pembina sentiasa mengembalikan objek baharu. Oleh itu, semua pelaksanaan Singletonbersembunyi untuk menyembunyikan pembina, mencipta kaedah statik awam yang mengawal seumur hidup objek tunggal, dan "memusnahkan" semua objek yang baru muncul. Jika Singleton diakses, ia harus sama ada mencipta objek baharu (jika belum wujud dalam program), atau mengembalikan objek sedia ada. Untuk mencapai ini:
  1. Anda perlu memberikan kelas medan statik peribadi yang menyimpan satu objek:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. Jadikan pembina (lalai) peribadi. Ini bermakna ia tidak boleh diakses di luar kelas dan 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 yet been created
                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 memastikan pelajar CodeGym berhubung dengan corak ini (dan corak reka bentuk secara umum), nuansa pelaksanaan tunggal yang lebih kompleks tidak akan diterangkan di sini. Kami hanya ambil perhatian bahawa, bergantung pada kerumitan program, corak ini mungkin perlu diperhalusi lagi. Contohnya, dalam persekitaran berbilang benang (lihat artikel tentang utas), beberapa utas berbeza boleh mengakses kaedah tunggal secara serentak, dan kod yang diterangkan di atas akan berhenti berfungsi, kerana setiap utas berasingan boleh mencipta contoh kelas. Akibatnya, masih terdapat beberapa pendekatan berbeza untuk mencipta singleton selamat benang yang betul. Tapi itu cerita lain =)

Dan akhirnya... Apakah inisialisasi malas yang ditanya oleh kapten?

Inisialisasi malas juga dipanggil permulaan tertunda. Ini adalah helah pengaturcaraan di mana operasi intensif sumber (dan mencipta objek ialah operasi intensif sumber) dilakukan atas permintaan dan bukannya terlebih dahulu. Jadi apa sebenarnya yang berlaku dalam kod Java Singleton kami ? Dalam erti kata lain, objek kita dicipta pada masa ia diakses, bukan terlebih dahulu. Anda tidak sepatutnya menganggap bahawa permulaan malas entah bagaimana terikat tegar dengan corak Singleton . Inisialisasi malas juga digunakan dalam corak reka bentuk ciptaan lain, seperti Proksi dan Kaedah Kilang, tetapi ini juga cerita lain =)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION