Corak Prototaip di Jawa

1. Pengenalan

Dalam tutorial ini, kita akan belajar tentang salah satu Corak Reka Bentuk Penciptaan - corak Prototaip. Pada mulanya, kami akan menerangkan corak ini dan kemudian terus menerapkannya di Java.

Kami juga akan membincangkan beberapa kelebihan dan kekurangannya.

2. Corak Prototaip

Corak Prototaip umumnya digunakan ketika kita memiliki contoh kelas (prototaip) dan kita ingin membuat objek baru dengan hanya menyalin prototaip .

Mari gunakan analogi untuk lebih memahami corak ini.

Dalam beberapa permainan, kami mahukan pokok atau bangunan di latar belakang. Kita mungkin sedar bahawa kita tidak perlu membuat pokok atau bangunan baru dan membuatnya di layar setiap kali watak bergerak.

Oleh itu, kami membuat contoh pokok terlebih dahulu. Kemudian kita dapat membuat seberapa banyak pokok yang kita inginkan dari contoh ini (prototaip) dan mengemas kini kedudukannya. Kami juga boleh memilih untuk menukar warna pokok untuk tahap baru dalam permainan.

Corak Prototaip agak serupa. Daripada membuat objek baru, kita hanya perlu mengklon contoh prototaip.

3. Diagram UML

Dalam rajah, kita melihat bahawa klien memberitahu prototaip untuk mengklon dirinya sendiri dan membuat objek. Prototaip adalah antara muka dan menyatakan kaedah untuk pengklonan itu sendiri. ConcretePrototype1 dan ConcretePrototype2 melaksanakan operasi untuk mengklon mereka sendiri.

4. Pelaksanaan

Salah satu cara kita dapat menerapkan corak ini di Java adalah dengan menggunakan kaedah klon () . Untuk melakukan ini, kami akan melaksanakan antara muka Cloneable .

Semasa kita cuba mengklon, kita harus memutuskan antara membuat salinan cetek atau dalam . Akhirnya, ia memenuhi syarat.

Sebagai contoh, jika kelas hanya mengandungi medan primitif dan tidak berubah, kami mungkin menggunakan salinan cetek.

Sekiranya mengandungi rujukan ke bidang yang dapat diubah, kita harus mencari salinan mendalam. Kami mungkin melakukannya dengan penyusun salinan atau serialisasi dan deserialisasi.

Mari kita ambil contoh yang kita sebutkan sebelumnya dan terus melihat bagaimana menerapkan corak Prototaip tanpa menggunakan antara muka Cloneable . Untuk melakukan ini, mari kita buat kelas abstrak yang disebut Tree dengan kaedah abstrak 'copy' .

public abstract class Tree { // ... public abstract Tree copy(); }

Sekarang katakan kita mempunyai dua pelaksanaan berbeza dari Tree yang disebut PlasticTree dan PineTree :

public class PlasticTree extends Tree { // ... @Override public Tree copy() { PlasticTree plasticTreeClone = new PlasticTree(this.getMass(), this.getHeight()); plasticTreeClone.setPosition(this.getPosition()); return plasticTreeClone; } }
public class PineTree extends Tree { // ... @Override public Tree copy() { PineTree pineTreeClone = new PineTree(this.getMass(), this.getHeight()); pineTreeClone.setPosition(this.getPosition()); return pineTreeClone; } }

Jadi di sini kita melihat bahawa kelas yang memperluas Tree dan melaksanakan kaedah penyalinan dapat bertindak sebagai prototaip untuk membuat salinan mereka sendiri.

Corak prototaip juga membolehkan kita membuat salinan objek tanpa bergantung pada kelas konkrit . Katakan kami mempunyai senarai pokok dan kami ingin membuat salinannya. Oleh kerana polimorfisme, kita dapat membuat banyak salinan dengan mudah tanpa mengetahui jenis pokok.

5. Menguji

Sekarang mari kita mengujinya:

public class TreePrototypesUnitTest { @Test public void givenAPlasticTreePrototypeWhenClonedThenCreateA_Clone() { // ... PlasticTree plasticTree = new PlasticTree(mass, height); plasticTree.setPosition(position); PlasticTree anotherPlasticTree = (PlasticTree) plasticTree.copy(); anotherPlasticTree.setPosition(otherPosition); assertEquals(position, plasticTree.getPosition()); assertEquals(otherPosition, anotherPlasticTree.getPosition()); } }

Kami melihat bahawa pokok itu telah diklon dari prototaip dan kami mempunyai dua contoh PlasticTree yang berbeza . Kami baru sahaja mengemas kini kedudukan di klon dan mengekalkan nilai yang lain.

Sekarang mari kita mengklon senarai pokok:

@Test public void givenA_ListOfTreesWhenClonedThenCreateListOfClones() { // create instances of PlasticTree and PineTree List trees = Arrays.asList(plasticTree, pineTree); List treeClones = trees.stream().map(Tree::copy).collect(toList()); // ... assertEquals(height, plasticTreeClone.getHeight()); assertEquals(position, plasticTreeClone.getPosition()); }

Perhatikan bahawa kita dapat membuat salinan mendalam dari daftar di sini tanpa bergantung pada pelaksanaan konkrit Tree.

6. Kelebihan & Kekurangan

Corak ini berguna apabila objek baru kita hanya sedikit berbeza dari objek yang ada. Dalam beberapa kes, keadaan mungkin hanya mempunyai beberapa kombinasi keadaan dalam kelas. Oleh itu, daripada membuat instance baru, kita mungkin membuat instance dengan keadaan yang sesuai terlebih dahulu dan kemudian mengklonnya kapan pun kita mahu .

Kadang-kadang, kita mungkin menemui subkelas yang hanya berbeza pada keadaannya. Kita dapat menghilangkan subkelas tersebut dengan membuat prototaip dengan keadaan awal dan kemudian mengklonnya.

Corak prototaip, sama seperti corak reka bentuk lain, harus digunakan hanya apabila sesuai. Oleh kerana kita mengklon objek, prosesnya akan menjadi rumit ketika ada banyak kelas, sehingga mengakibatkan kekacauan. Selain itu, sukar untuk mengklon kelas yang mempunyai rujukan bulat.

7. Kesimpulannya

Dalam tutorial ini, kami mempelajari konsep utama pola Prototaip dan melihat bagaimana menerapkannya di Java. Kami juga membincangkan beberapa kebaikan dan keburukannya.

Seperti biasa, kod sumber untuk artikel ini terdapat di Github.