Pola Prototipe di Jawa

1. Perkenalan

Dalam tutorial ini, kita akan belajar tentang salah satu Pola Desain Kreasi - pola Prototipe. Pertama, kami akan menjelaskan pola ini dan kemudian melanjutkan untuk menerapkannya di Java.

Kami juga akan membahas beberapa kelebihan dan kekurangannya.

2. Pola Prototipe

Pola Prototipe umumnya digunakan ketika kita memiliki turunan kelas (prototipe) dan kita ingin membuat objek baru dengan hanya menyalin prototipe .

Mari gunakan analogi untuk lebih memahami pola ini.

Dalam beberapa permainan, kami menginginkan pepohonan atau bangunan sebagai latar belakang. Kita mungkin menyadari bahwa kita tidak perlu membuat pohon atau bangunan baru dan menampilkannya di layar setiap kali karakter bergerak.

Jadi, kami membuat instance pohon terlebih dahulu. Kemudian kita dapat membuat pohon sebanyak yang kita inginkan dari contoh ini (prototipe) dan memperbarui posisinya. Kami juga dapat memilih untuk mengubah warna pepohonan untuk level baru dalam game.

Pola Prototipe sangat mirip. Alih-alih membuat objek baru, kita hanya perlu menggandakan contoh prototipe.

3. Diagram UML

Dalam diagram, kita melihat bahwa klien memberi tahu prototipe untuk mengkloning dirinya sendiri dan membuat objek. Prototipe adalah antarmuka dan mendeklarasikan metode kloning itu sendiri. ConcretePrototype1 dan ConcretePrototype2 menerapkan operasi untuk mengkloning dirinya sendiri.

4. Implementasi

Salah satu cara kita bisa mengimplementasikan pola ini di Java adalah dengan menggunakan metode clone () . Untuk melakukan ini, kami akan mengimplementasikan antarmuka Cloneable .

Saat kita mencoba untuk mengkloning, kita harus memutuskan antara membuat salinan dangkal atau dalam . Akhirnya, itu bermuara pada persyaratan.

Misalnya, jika kelas hanya berisi bidang primitif dan tidak dapat diubah, kita dapat menggunakan salinan dangkal.

Jika itu berisi referensi ke bidang yang bisa berubah, kita harus mencari salinan dalam. Kami mungkin melakukannya dengan konstruktor salinan atau serialisasi dan deserialisasi.

Mari kita ambil contoh yang kami sebutkan sebelumnya dan lanjutkan untuk melihat bagaimana menerapkan pola Prototipe tanpa menggunakan antarmuka Cloneable . Untuk melakukan ini, mari buat kelas abstrak yang disebut Tree dengan metode abstrak 'copy' .

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

Sekarang katakanlah kita memiliki dua implementasi yang berbeda dari pohon 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 bahwa kelas yang memperluas Tree dan mengimplementasikan metode salin dapat bertindak sebagai prototipe untuk membuat salinannya sendiri.

Pola prototipe juga memungkinkan kita membuat salinan objek tanpa bergantung pada kelas konkret . Katakanlah kita memiliki daftar pohon dan kita ingin membuat salinannya. Karena polimorfisme, kita dapat dengan mudah membuat banyak salinan tanpa mengetahui jenis pohon.

5. Pengujian

Sekarang mari kita uji:

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 bahwa pohon telah dikloning dari prototipe dan kami memiliki dua contoh PlasticTree yang berbeda . Kami baru saja memperbarui posisi di klon dan mempertahankan nilai lainnya.

Sekarang mari kita mengkloning daftar pohon:

@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 bahwa kita dapat membuat salinan lengkap daftar di sini tanpa bergantung pada implementasi konkret Tree.

6. Keuntungan & Kerugian

Pola ini berguna ketika objek baru kita hanya sedikit berbeda dari yang sudah ada. Dalam beberapa kasus, contoh mungkin hanya memiliki beberapa kombinasi keadaan di kelas. Jadi, alih-alih membuat instance baru, kami dapat membuat instance dengan status yang sesuai sebelumnya dan kemudian mengkloningnya kapan pun kami mau .

Terkadang, kami mungkin menemukan subclass yang hanya berbeda dalam statusnya. Kita bisa menghilangkan subclass tersebut dengan membuat prototipe dengan status awal dan kemudian menggandakannya.

Pola prototipe, sama seperti pola desain lainnya, harus digunakan hanya jika sesuai. Karena kita mengkloning objek, prosesnya bisa menjadi kompleks jika ada banyak kelas, sehingga menghasilkan kekacauan. Selain itu, sulit untuk mengkloning kelas yang memiliki referensi melingkar.

7. Kesimpulan

Dalam tutorial ini, kami mempelajari konsep utama dari pola Prototipe dan melihat bagaimana menerapkannya di Java. Kami juga membahas beberapa pro dan kontra.

Seperti biasa, kode sumber untuk artikel ini tersedia di Github.