- Published on
Factory Pattern dengan Golang
- Authors
- Name
- Aulia' Illahi
- @alfath_go
- Name
Definisi
Factory Design Pattern adalah salah satu dari creational design pattern yang merupakah turunan dari abstract factory, factory menyembunyikan proses logic pembuatan object. sehingga client / user hanya perlu mengakses class / struct yg dibuat tanpa perlu tahu fungsi create objeknya.
Saya akan mengambil contoh kasus sebuah aset catalog pada web lelang. Aset tersebut terdiri dari aset dengan kategori Bangunan, Tanah, dan Kendaraan.
Aset memiliki 3 kategori:
- Bangunan
- Tanah
- Kendaraan
Nah dari kategori tersebut kita dapat membuat breakdown berdasarkan konsep UML factory design pattern sebagai berikut
- AssetFactory (factory.go)
- Asset (asset.go)
- IAsset (iAsset.go)
- Concrete Product Bangunan (bangunan.go)
- Concrete Product Tanah (tanah.go)
- Concrete Product Kendaraan (kendaraan.go)
- Client (main.go)
Sekarang mari kita implementasi ke kode program
Implementasi
factory.go
package main
import "fmt"
func getAssets(assetCategory string) (iAsset, error) {
if assetCategory == "kendaraan" {
return newKendaraan(), nil
}
if assetCategory == "bangunan" {
return newBangunan(), nil
}
if assetCategory == "tanah" {
return newTanah(), nil
}
return nil, fmt.Errorf("wrong category")
}
asset.go
package main
type asset struct {
nama string
price float64
desc string
}
func (a *asset) setNama(str string) {
a.nama = str
}
func (a *asset) setPrice(price float64) {
a.price = price
}
func (a *asset) setDesc(desc string) {
a.desc = desc
}
func (a *asset) getNama() string {
return a.nama
}
func (a *asset) getPrice() float64 {
return a.price
}
func (a *asset) getDesc() string {
return a.desc
}
iasset.go
package main
type iAsset interface {
setNama(str string)
setPrice(price float64)
setDesc(desc string)
getNama() string
getPrice() float64
getDesc() string
}
bangunan.go
package main
type bangunan struct {
asset
}
func newBangunan() iAsset {
return &bangunan{
asset: asset{
nama: "Bangunan 1",
price: 89939393,
desc: "Keterangna",
},
}
}
tanah.go
package main
type tanah struct {
asset
}
func newTanah() iAsset {
return &tanah{
asset: asset{
nama: "Tanah 1",
price: 89939393,
desc: "Keterangna",
},
}
}
kendaraan.go
package main
type kendaraan struct {
asset
}
func newKendaraan() iAsset {
return &kendaraan{
asset: asset{
nama: "Kendaraan 1",
price: 89939393,
desc: "Keterangna",
},
}
}
main.go
package main
import "fmt"
func main() {
bangunan, _ := getAssets("bangunan")
tanah, _ := getAssets("tanah")
kendaraan, _ := getAssets("kendaraan")
printDetails(bangunan)
printDetails(kendaraan)
printDetails(tanah)
}
func printDetails(g iAsset) {
fmt.Printf("Assets : %s\n", g.getNama())
fmt.Printf("Harga: %.2f\n", g.getPrice())
fmt.Printf("Deskripsi : %s\n", g.getDesc())
}