Pada modul ini kita akan mengimplementasikan pattern prototype. Skenarionya adalah, data pekerja, dimana perusahaan memiliki beberapa gedung berbeda.
Jadi kita dapat menggunakan prototype untuk object data alamat perusahaan. Selanjutnya kita tinggal meng-clone object tersebut ketika diperlukan untuk membuat data pekerja.
package main import ( "bytes" "encoding/gob" "fmt" ) type Address struct { Suite int StreetAddress, City string } type Employee struct { Name string Office Address } func (p *Employee) DeepCopy() *Employee { b := bytes.Buffer{} e := gob.NewEncoder(&b) _ = e.Encode(p) d := gob.NewDecoder(&b) result := Employee{} _ = d.Decode(&result) return &result } var mainOffice = Employee{ "", Address{0, "Jl. Hayam Wuruk 100", "JakPus"}} var auxOffice = Employee{ "", Address{0, "Jl. Kemangginsan Raya 20", "JakBar"}} // utility method untuk konfigurasi pegawai // perhatikan fungsi menggunakan lowercase func newEmployee(proto *Employee, name string, suite int) *Employee { result := proto.DeepCopy() result.Name = name result.Office.Suite = suite return result } func NewMainOfficeEmployee( name string, suite int) *Employee { return newEmployee(&mainOffice, name, suite) } func NewAuxOfficeEmployee( name string, suite int) *Employee { return newEmployee(&auxOffice, name, suite) } func main() { budi := NewMainOfficeEmployee("Budi", 100) wati := NewAuxOfficeEmployee("Wati", 200) fmt.Println(budi) fmt.Println(wati) }
Jika dijalankan, sesuai ekspektasi, data employe berhasi dibuat menggunakan pattern prototype.
&{Budi {100 Jl. Hayam Wuruk 100 JakPus}}
&{Wati {200 Jl. Kemangginsan Raya 20 JakBar}}
Kesimpulan
Untuk menggunakan pattern prototype, object akan di construct sebagian. Pada prototype akan di dilakukan deep copy, dan kemudian baru lakukan modifikasi pada instance yang dihasilkan.