{"id":2515,"date":"2022-04-18T15:37:37","date_gmt":"2022-04-18T15:37:37","guid":{"rendered":"https:\/\/sunaonako.my.id\/?p=2515"},"modified":"2022-08-28T12:45:36","modified_gmt":"2022-08-28T12:45:36","slug":"design-pattern-prototype-lengkap-kode-uml-kotlin","status":"publish","type":"post","link":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/","title":{"rendered":"Pengertian dan Implementasi Prototype Design Pattern"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Pengertian Design Pattern Prototype adalah bagian dari creational design pattern yang memungkinkan kamu <strong>menyalin object<\/strong> yang ada tanpa membuat kodemu<strong> bergantung pada class yang disalin<\/strong>. Prinsip Design Pattern ini merupakan salah satu turunan dari Creational Pattern. <em>Prototype Design Pattern <\/em>adalah konsep membuat objek dengan cara melakukan cloning pada objek yang sudah tersedia. Karena terkadang membuat objek baru memakan banyak resource di memori. Umumnya untuk membuat objek serupa kamu perlu melakukan <em>inheritance<\/em> yang terkadang akan menciptakan hierarki kompleks sehingga menyulitkan untuk melakukan <em>tracing<\/em> <em>method<\/em>. <em>Fungsi ini turunan dari kelas yang mana?<\/em> Dengan menerapkan prototype pattern, manfaatnya adalah kita dapat menyederhanakan sebuah objek yang menggunakan inheritance sangat kompleks, menjadi lebih <em>flat<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Permasalahan Arsitektur Code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Misal ada sebuah object, Anda ingin untuk membuat duplikat yang sama persis dari object tersebut. Cara pertama yang terpikirkan adalah untuk membuat object baru dari class yang sama (Object objekbaru = new Object()). Lalu, mengisi setiap fields \/ parameter dari object yang ingin diduplikat dan meduplikat setiap values dari object baru tersebut.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tapi, apabila menggunakan cara seperti ini, terdapat masalah yang tak terlihat. Tidak semua objects dapat disalin menggunakan cara tersebut karena beberapa fields dari object tesebut mungkin ada yang di <em>private<\/em> sehingga tidak dapat diakses dari luar object tersebut.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Prototype Design Pattern <\/strong>menjadi solusi arsitektur struktur data misalnya:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Mencegah deklarasi value dari field objek satu-persatu, hanya agar mempunyai field yang serupa dengan objek yang ingin ditiru. <\/li><li>Melakukan cloning sampai ke field yang sedang diprivat sekaligus<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Solusi Melakukan Duplikat Objek<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Design Pattern Prototype bertujuan untuk melakukan proses duplikasi dari suatu object menjadi object baru yang serupa. Jadi, pattern ini mendeklarasikan suatu interface untuk tiap object yang support untuk melakukan cloning. Interface ini bertujuan untuk membolehkan Kamu untuk menduplikasi suatu object tanpa coupling dari kode kamu terhadap class dari object tersebut. Biasanya, interface tersebut hanya berisi satu method yaitu clone\u200b.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">UML Design Pattern Prototype<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Perhatikan tampilan diagram UML Prototype Pattern ini<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"907\" height=\"583\" src=\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image.png\" alt=\"UML of Design Pattern Prototype Principle\" class=\"wp-image-2557\" srcset=\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image.png 907w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-300x193.png 300w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-768x494.png 768w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-360x231.png 360w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-545x350.png 545w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Interface Prototype<\/em> akan berisi <strong>abstract method umum yang wajib ada<\/strong> untuk dalam objek cloning (semisal mobil wajib meniru fitur roda). Kita bisa menggunakan method bawaan <em>cloneable<\/em>,  namun dengan membuat interface prototype ini, kamu dapat mencegah <em>tight coupling<\/em> ketika melakukan copy ke <em><strong>ConcretePrototype <\/strong><\/em>atau salinan-salinan prototype. Sedangkan ConcretePrototype akan melakukan extends dari Prototype interface dengan melakukan override dari Clone method<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Contoh case kapan menggunakan Creational Design Pattern Prototype<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Contoh case dimana kita perlu menggunakan prototype adalah konsep <strong>multi role<\/strong> dimana membuat objek dengan role yang berbeda bisa sangat berat, bayangkan masing-masing objek perlu mengakses database dan konfigurasi yang memerlukan komunikasi di luar aplikasi secara terpisah. Tentu menjadi isu performa bagi aplikasi. Terus, bagaimana prototype berguna pada case multi role ini?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><br>Kita menentukan <strong>main objek<\/strong> yang akan digunakan sebagai <strong>prototipe<\/strong>, isinya adalah <strong><em>apa yang menjadi kesamaan dari setiap objek<\/em><\/strong>. Misal <em>role<\/em>, maka masukkan ke dalam kelas prototipe. Anggap isinya tentang <em>access control<\/em>, kemudian objek prototipe itu kita implementasikan clone method juga. Kemudian dibuat kelas role, seperti admin, student (Siswa, Mahasiswa), pengajar (Dosen, Guru), dll yang akan mengimplementasi salinan dari kelas prototipe yang berisi access control tersebut.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tahapan Implementasi Prototype Design Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jadi sebenarnya seperti apa konsep design pattern prototype dapat dilihat dalam list berikut:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Membuat objek melalui menyalin objek yang tersedia<\/li><li>Objek yang bertindak sebagai prototype bekerja dengan mengelola state dari objek<\/li><li>Kotlin dan Java punya fitur ini, yaitu dengan memanggil Clone method, yang merupakan tipe interface<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Langkah pertama, buat <strong>interface Objek<\/strong> yang memiliki method clone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kalau kita memakai method Clone bawaan dari kotlin (Cloneable interface), ini bersifat shallow clone karena sebenarnya hanya bertindak sebagai reference tetapi tidak mengerjakan cloning yang sesungguhnya dari objek yang menjadi implement dibaliknya. Dengan membuat objek interface tersendiri (deep clone) kamu menerapkan single responsibility principle dalam memanage kelas prototipe dan lebih mudah untuk implementasi Cloning.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Prototype {\n   fun clone(): Prototype\n   \/*Add other universal field of prototype here\n   * *\/\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Langkah kedua, buat <em>ekstensi <\/em>dari <strong>Prototype<\/strong>, yaitu bentuk lebih real atau <strong>konkrit dari prototype<\/strong>, misal <strong>untuk prototipe kendaraan, kita akan extend dalam kelas kendaraan roda dua<\/strong>. Jika ingin membuat clone berbeda, cukup buat concrete prototype kedua, misal kendaraan roda empat.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class FirstConcretePrototype : Prototype {\n    var name: String\n        private set\n\n    constructor(name: String) {\n        this.name = name\n    }\n\n    constructor(prototype: FirstConcretePrototype) {\n        name = prototype.name\n    }\n\n    override fun clone(): Prototype {\n        return FirstConcretePrototype(this)\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Buat Objek Concrete Kedua<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SecondaryConcretePrototype : Prototype {\n    var number: Int\n        private set\n\n    var name: String = \"\"\n\n    constructor(name: String, id: Int){\n        this.name = name\n        this.number = id\n    }\n\n    constructor(id: Int){\n        this.number = id\n    }\n\n    override fun clone(): Prototype {\n        return SecondaryConcretePrototype(name, number)\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kemudian buat Kelas ProtototypeRegistry bertugas sebagai <strong>penyimpanan instance objek hasil clone yang dibuat.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PrototypeRegistry {\n    private val prototypeRegistry: MutableMap&lt;String, Prototype>\n\n    init {\n        prototypeRegistry = HashMap()\n    }\n\n    fun addPrototypeToRegistory(prototypeName: String, prototype: Prototype) {\n        prototypeRegistry[prototypeName] = prototype\n    }\n\n    fun getPrototypeCloneFromPrototypeRegistory(name: String): Prototype {\n        return prototypeRegistry[name]!!.clone()\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kamu juga dapat membuat <em>get prototypefactory method<\/em> didalam kelas registry untuk mereturn objek clone sehingga kamu dapat mengakses kembali hasil clone di tempat lain. Atau mungkin kamu ingin membuat sebuah clone yang terdiri dari beberapa gabungan clone objek, kamu bisa membuat class factory terpisah dari class registry. Pada kode diatas, prototypeRegistry berfungsi untuk menyimpan objek yang akan diclone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sedangkan GetPrototypeCloneFromPrototypeRegistory ini akan mereturn clone objek yang telah disimpan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pada client lakukan pemanggilan concrete object<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Client {\n    companion object{\n        @JvmStatic\n        fun main(args: Array&lt;String&gt;) {\n            val prototype = FirstConcretePrototype(\"Test name\")\n            val registory = PrototypeRegistry()\n            registory.addPrototypeToRegistory(\"Original\", prototype)\n            val clone = registory.getPrototypeCloneFromPrototypeRegistory(\"Original\") as FirstConcretePrototype\n\n            println(\"$prototype is ${prototype.name}\")\n            println(\"$clone is cloning ${clone.name}\")\n\n            val secondaryPrototype = SecondaryConcretePrototype(\"second test\", 1)\n            registory.addPrototypeToRegistory(\"Second\", secondaryPrototype)\n            val secondClone = registory.getPrototypeCloneFromPrototypeRegistory(\"Second\") as SecondaryConcretePrototype\n\n            println(\"$secondaryPrototype is ${secondaryPrototype.name} has ${secondaryPrototype.number}\")\n            println(\"$secondClone is copy of ${secondClone.name}\")\n\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pada kode client, terdapat inisialisasi object Prototype yaitu val prototype, kemudian disimpan dalam variable clone bernama registory. Sehingga dibandingkan menginisiasi kembali objek, kamu bisa meminta registory untuk mengakses objek clone dari prototype.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"751\" height=\"230\" src=\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-1.png\" alt=\"Kotlin Creational Design Pattern, Demo of implementation of Prototype Design Pattern\" class=\"wp-image-2558\" srcset=\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-1.png 751w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-1-300x92.png 300w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-1-360x110.png 360w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-1-545x167.png 545w\" sizes=\"(max-width: 751px) 100vw, 751px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Jika kalian lihat objek concrete dan clonningan dari objek concrete mempunyai referensi objek yang berbeda. Tetapi masing-masing value di baik objek concrete dan salinnya ternyata sama. Coba lihat val <code>prototype <\/code>hasil getname nya sama seperti value getname dari objek <code>clone<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>val prototype = FirstConcretePrototype(\"Test name\")\n            val registory = PrototypeRegistry()\n            registory.addPrototypeToRegistory(\"Original\", prototype)\n            val clone = registory.getPrototypeCloneFromPrototypeRegistory(\"Original\") as FirstConcretePrototype\n\n            println(\"$prototype is ${prototype.name}\")\n            println(\"$clone is cloning ${clone.name}\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demo Kode implementasi untuk Real Case Design Pattern Prototype<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sekarang, kita coba pada demo kedua, yaitu kasus file ekstraksi, misal ekstraksi file berbeda satu dengan lain tergantung dengan ekstensi. Di sini Prototipe Object adalah Archiver dengan Concrete Object adalah ZipArchiver dan RarArchiver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Buat Kelas Interface Prototype dengan nama Archive, deklarasikan abstract method yang dapat dicloning<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">interface Archive {\n    fun archive(directory: File?)\n    fun clone(): Archive\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">ConcretePrototype<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class RarArchiver : Archive {\n    override fun archive(directory: File?) {\n        println(\"Rar archiver + ${directory!!.path}\")\n    }\n\n    override fun clone(): Archive {\n        return RarArchiver()\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>class ZipArchiver : Archive, Serializable {\n    override fun archive(directory: File?) {\n        println(\"Zip Archiver + ${directory!!.path}\")\n    }\n\n    override fun clone(): Archive {\n        return ZipArchiver()\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Factory<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>object ArchiveFactory {\n    private val prototypes: MutableMap&lt;String, Archive&gt; = HashMap()\n\n    init {\n        prototypes&#91;\"zip\"] = ZipArchiver()\n        prototypes&#91;\"rar\"] = RarArchiver()\n    }\n\n    fun getPrototypeForType(archiverType: String): Archive {\n        return prototypes&#91;archiverType]!!.clone()\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kelas ini akan menyimpan objek yang kompatible dengan Archiver. Dengan masing-masing disimpan dalam Mutablemap sehingga untuk memanggil prototipe yang dibutuhkan cukup dengan memanggil keynya.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Demo {\n    companion object{\n        @JvmStatic\n        fun main(args: Array&lt;String>) {\n            val archiverType1 = \"zip\"\n            val archiverType2 = \"rar\"\n            val zipArchiver: Archive = ArchiveFactory.getPrototypeForType(archiverType1)\n            val rarArchiver: Archive = ArchiveFactory.getPrototypeForType(archiverType2)\n            zipArchiver.archive(File(\"Subscribe to FB, IG, and YT\"))\n            rarArchiver.archive(File(\"of nakotek (Wahaha)\"))\n        }\n    }\n}<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"469\" height=\"136\" src=\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-2.png\" alt=\"\" class=\"wp-image-2559\" srcset=\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-2.png 469w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-2-300x87.png 300w, https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/image-2-360x104.png 360w\" sizes=\"(max-width: 469px) 100vw, 469px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Untuk versi advanced dari penggunaan prototype design pattern, kamu bisa lihat di Creational.Demo pada folder maze, <a href=\"https:\/\/link.ap1.storjshare.io\/jwbosslvowl7msonnjasarznomiq\/course%2Fdsgnpattern.rar\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"download di \">download di <\/a><a href=\"https:\/\/link.ap1.storjshare.io\/jwbosslvowl7msonnjasarznomiq\/course%2Fdsgnpattern.rar\" target=\"_blank\" rel=\"noreferrer noopener\">sini<\/a>.<br>Kesimpulan dari design pattern prototype ini adalah sebuah cara untuk membuat objek baru dengan menyalin objek yang sudah ada tanpa memodifikasi internal objek. Metode ini menjadi alternatif apabila membuat objek merupakan operasi yang \u201cmahal\u201d. Untuk tutorial struktur data lainnya, <a href=\"https:\/\/sunaonako.my.id\/blog\/category\/software-architecture\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"silahkan kunjungi link ini.\">silahkan kunjungi link ini.<\/a><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pengertian Design Pattern Prototype adalah bagian dari creational design pattern yang memungkinkan kamu menyalin object yang ada tanpa membuat kodemu bergantung pada class yang disalin. Prinsip Design Pattern ini merupakan salah satu turunan dari Creational Pattern. Prototype Design Pattern adalah konsep membuat objek dengan cara melakukan cloning pada objek yang sudah tersedia. Karena terkadang membuat&#8230;<\/p>\n","protected":false},"author":2,"featured_media":2560,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[280,289],"tags":[278,286,287],"class_list":["post-2515","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-architecture","category-software-principle","tag-design-pattern","tag-kotlin","tag-uml"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.8 (Yoast SEO v23.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Memahami Implementasi Design Pattern Prototype dengan Kotlin<\/title>\n<meta name=\"description\" content=\"Mengenal Creational Design Pattern Prototype. Struktur UML Prototype Design Pattern. Demo dan Source Code memakai Java Kotlin dengan penjelasan mendalam.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pengertian dan Implementasi Prototype Design Pattern\" \/>\n<meta property=\"og:description\" content=\"Mengenal Creational Design Pattern Prototype. Struktur UML Prototype Design Pattern. Demo dan Source Code memakai Java Kotlin dengan penjelasan mendalam.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/\" \/>\n<meta property=\"og:site_name\" content=\"Hilarious Developer School\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-18T15:37:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-08-28T12:45:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"nakomin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"nakomin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/\"},\"author\":{\"name\":\"nakomin\",\"@id\":\"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a\"},\"headline\":\"Pengertian dan Implementasi Prototype Design Pattern\",\"datePublished\":\"2022-04-18T15:37:37+00:00\",\"dateModified\":\"2022-08-28T12:45:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/\"},\"wordCount\":959,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a\"},\"image\":{\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png\",\"keywords\":[\"Design Pattern\",\"Kotlin\",\"UML\"],\"articleSection\":[\"Software Architecture\",\"Software Principle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/\",\"url\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/\",\"name\":\"Memahami Implementasi Design Pattern Prototype dengan Kotlin\",\"isPartOf\":{\"@id\":\"https:\/\/sunaonako.my.id\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png\",\"datePublished\":\"2022-04-18T15:37:37+00:00\",\"dateModified\":\"2022-08-28T12:45:36+00:00\",\"description\":\"Mengenal Creational Design Pattern Prototype. Struktur UML Prototype Design Pattern. Demo dan Source Code memakai Java Kotlin dengan penjelasan mendalam.\",\"breadcrumb\":{\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage\",\"url\":\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png\",\"contentUrl\":\"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png\",\"width\":1200,\"height\":628,\"caption\":\"Full Guide of Creational Design Pattern Prototype Principle with Kotlin, UML Visual and Real Case Implementation\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/sunaonako.my.id\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pengertian dan Implementasi Prototype Design Pattern\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/sunaonako.my.id\/#website\",\"url\":\"https:\/\/sunaonako.my.id\/\",\"name\":\"Hilarious Developer School\",\"description\":\"Catatan Developer tentang Kurikulum Dunia Modern\",\"publisher\":{\"@id\":\"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/sunaonako.my.id\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a\",\"name\":\"nakomin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/sunaonako.my.id\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/cdn.sunaonako.my.id\/aruuploads\/2021\/07\/Minimalist-Letter-Initial-Logo.png\",\"contentUrl\":\"https:\/\/cdn.sunaonako.my.id\/aruuploads\/2021\/07\/Minimalist-Letter-Initial-Logo.png\",\"width\":\"250\",\"height\":\"250\",\"caption\":\"nakomin\"},\"logo\":{\"@id\":\"https:\/\/sunaonako.my.id\/#\/schema\/person\/image\/\"},\"description\":\"Believe at the heart of BNRS Here you will find content about developers needs whether it\u2019s coding tutorials or the lifestyle of employee in the IT circle, understanding of the realm of ui\/ux and futuristic tech for free in one place. Don\u2019t forget to follow the nakotek socials to give the author enthusiasm in pioneering this website. #wahahaforever\",\"sameAs\":[\"https:\/\/sunaonako.my.id\"],\"url\":\"https:\/\/sunaonako.my.id\/tomodachi\/nakomin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Memahami Implementasi Design Pattern Prototype dengan Kotlin","description":"Mengenal Creational Design Pattern Prototype. Struktur UML Prototype Design Pattern. Demo dan Source Code memakai Java Kotlin dengan penjelasan mendalam.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/","og_locale":"en_US","og_type":"article","og_title":"Pengertian dan Implementasi Prototype Design Pattern","og_description":"Mengenal Creational Design Pattern Prototype. Struktur UML Prototype Design Pattern. Demo dan Source Code memakai Java Kotlin dengan penjelasan mendalam.","og_url":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/","og_site_name":"Hilarious Developer School","article_published_time":"2022-04-18T15:37:37+00:00","article_modified_time":"2022-08-28T12:45:36+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png","type":"image\/png"}],"author":"nakomin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"nakomin","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#article","isPartOf":{"@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/"},"author":{"name":"nakomin","@id":"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a"},"headline":"Pengertian dan Implementasi Prototype Design Pattern","datePublished":"2022-04-18T15:37:37+00:00","dateModified":"2022-08-28T12:45:36+00:00","mainEntityOfPage":{"@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/"},"wordCount":959,"commentCount":0,"publisher":{"@id":"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a"},"image":{"@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage"},"thumbnailUrl":"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png","keywords":["Design Pattern","Kotlin","UML"],"articleSection":["Software Architecture","Software Principle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/","url":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/","name":"Memahami Implementasi Design Pattern Prototype dengan Kotlin","isPartOf":{"@id":"https:\/\/sunaonako.my.id\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage"},"image":{"@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage"},"thumbnailUrl":"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png","datePublished":"2022-04-18T15:37:37+00:00","dateModified":"2022-08-28T12:45:36+00:00","description":"Mengenal Creational Design Pattern Prototype. Struktur UML Prototype Design Pattern. Demo dan Source Code memakai Java Kotlin dengan penjelasan mendalam.","breadcrumb":{"@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#primaryimage","url":"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png","contentUrl":"https:\/\/sunaonako.my.id\/aruuploads\/2022\/04\/Prototype-Kotlin.png","width":1200,"height":628,"caption":"Full Guide of Creational Design Pattern Prototype Principle with Kotlin, UML Visual and Real Case Implementation"},{"@type":"BreadcrumbList","@id":"https:\/\/sunaonako.my.id\/blog\/design-pattern-prototype-lengkap-kode-uml-kotlin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sunaonako.my.id\/"},{"@type":"ListItem","position":2,"name":"Pengertian dan Implementasi Prototype Design Pattern"}]},{"@type":"WebSite","@id":"https:\/\/sunaonako.my.id\/#website","url":"https:\/\/sunaonako.my.id\/","name":"Hilarious Developer School","description":"Catatan Developer tentang Kurikulum Dunia Modern","publisher":{"@id":"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sunaonako.my.id\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/sunaonako.my.id\/#\/schema\/person\/e35d0cb9128a86b66ec2ba6abacadd5a","name":"nakomin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sunaonako.my.id\/#\/schema\/person\/image\/","url":"https:\/\/cdn.sunaonako.my.id\/aruuploads\/2021\/07\/Minimalist-Letter-Initial-Logo.png","contentUrl":"https:\/\/cdn.sunaonako.my.id\/aruuploads\/2021\/07\/Minimalist-Letter-Initial-Logo.png","width":"250","height":"250","caption":"nakomin"},"logo":{"@id":"https:\/\/sunaonako.my.id\/#\/schema\/person\/image\/"},"description":"Believe at the heart of BNRS Here you will find content about developers needs whether it\u2019s coding tutorials or the lifestyle of employee in the IT circle, understanding of the realm of ui\/ux and futuristic tech for free in one place. Don\u2019t forget to follow the nakotek socials to give the author enthusiasm in pioneering this website. #wahahaforever","sameAs":["https:\/\/sunaonako.my.id"],"url":"https:\/\/sunaonako.my.id\/tomodachi\/nakomin\/"}]}},"_links":{"self":[{"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/posts\/2515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/comments?post=2515"}],"version-history":[{"count":0,"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/posts\/2515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/media\/2560"}],"wp:attachment":[{"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/media?parent=2515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/categories?post=2515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sunaonako.my.id\/apps-api\/wp\/v2\/tags?post=2515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}