Creational Design Pattern: Prototype – Part 1

Prototype adalah creational design pattern dimana kita dapat mengcopy object yang telah ada dan tidak bergantung terhadap class dari object yang dicopy.

Dalam designpattern prototype banyak digunakan pointer, untuk itu harus dipastikan saat mengclone object harus melakukan deep copy.

Berikut contoh permasalahan bila tidak dilakukan deep copy.

package main

import "fmt"

type DataSiswa struct {
	Kelas, Jurusan string
}

type Siswa struct {
	Nama      string
	DataSiswa *DataSiswa
}

func main() {
	budi := Siswa{"Budi",
		&DataSiswa{"1-1", "IPA"}}

	wati := budi

	//shallow copy
	// kita dapat mengubah nama dari instance wati
	wati.Nama = "Wati"

	//saat kita mengubah datasiswa yang berupa pointer, akan mengubah data instance budi
	wati.DataSiswa.Kelas = "1-2"

	fmt.Println(budi.Nama, budi.DataSiswa)
	fmt.Println(wati.Nama, budi.DataSiswa)
}
Budi &{1-2 IPA}
Wati &{1-2 IPA}

Berikut cara melakukan deep copy

package main

import "fmt"

type DataSiswa struct {
	Kelas, Jurusan string
}

type Siswa struct {
	Nama      string
	DataSiswa *DataSiswa
}

func main() {
	budi := Siswa{"Budi",
		&DataSiswa{"1-1", "IPA"}}

	// wati := budi

	// //shallow copy
	// // kita dapat mengubah nama dari instance wati
	// wati.Nama = "Wati"

	// //saat kita mengubah datasiswa yang berupa pointer, akan mengubah data instance budi
	// wati.DataSiswa.Kelas = "1-2"

	// fmt.Println(budi.Nama, budi.DataSiswa)
	// fmt.Println(wati.Nama, budi.DataSiswa)

	// deep copy
	wati := budi
	wati.DataSiswa = &DataSiswa{
		budi.DataSiswa.Kelas,
		budi.DataSiswa.Jurusan}

	wati.Nama = "Wati" // ok

	wati.DataSiswa.Kelas = "1-2"

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

Jika code dijalankan, maka assignment yang dilakukan pada instance wati tidak akan mempengaruhi instance budi.

Budi &{1-1 IPA}
Wati &{1-2 IPA}

Jadi deep copying akan membuat object baru dengan memory terpisah dari object original, sementara shallow copy hanya akan mengcopy data address, yaitu pointer ke object original.

Data value type semuanya secara default adalah deep copy, contoh array, int, string, struct, float dan bool.

Data berupa reference secara default adalah shallow copy, contoh slice dan map.

Sharing is caring:

Leave a Comment