Creational Design Pattern: Prototype – Part 3

Masih melanjutkan dari contoh modul sebelumnya, pada modul ini kita akan memperkenalkan metode deep copy dengan serilization. Pada modul akan digunakan binary serialization.

Prosesnya akan lebih mudah dari metode sebelumnya, karena kita tidak perlu memastikan setiap field untuk dilakukan deep copy.

Fungsi untuk melakukan deep copy adalah seperti berikut:

func (s *Siswa) DeepCopy() *Siswa {
	// note: no error handling below
	b := bytes.Buffer{}
	e := gob.NewEncoder(&b)
	_ = e.Encode(s)

	// jika anda ingin melihat hasil serilization
	fmt.Println(string(b.Bytes()))

	d := gob.NewDecoder(&b)
	result := Siswa{}
	_ = d.Decode(&result)
	return &result

}

Berikut isi lengkap code contoh melakukan deep copy menggunakan serilization.

package main

import (
	"bytes"
	"encoding/gob"
	"fmt"
)

type DataSiswa struct {
	Kelas, Jurusan string
}

type Siswa struct {
	Nama      string
	DataSiswa *DataSiswa
	ListTeman []string
}

func (s *Siswa) DeepCopy() *Siswa {
	// note: no error handling below
	b := bytes.Buffer{}
	e := gob.NewEncoder(&b)
	_ = e.Encode(s)

	// peek into structure
	fmt.Println(string(b.Bytes()))

	d := gob.NewDecoder(&b)
	result := Siswa{}
	_ = d.Decode(&result)
	return &result

}

func main() {
	budi := Siswa{"Budi",
		&DataSiswa{"1-1", "IPA"},
		[]string{"agus", "bambang"}}

	wati := budi.DeepCopy()
	wati.Nama = "Wati"
	wati.DataSiswa.Kelas = "1-2"
	wati.ListTeman = append(wati.ListTeman, "Tuti")

	fmt.Println(budi, budi.DataSiswa)
	fmt.Println(wati, wati.DataSiswa)
}

Sampai disini kita sudah membahas proses deep copy, pada modul selanjutnya kita akan mulai membahas penggunaan prototype pattern.

Sharing is caring:

Leave a Comment