Published on

Factory Pattern dengan Golang

Authors

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.

UML-factory-design-pattern

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:

  1. Bangunan
  2. Tanah
  3. Kendaraan

Nah dari kategori tersebut kita dapat membuat breakdown berdasarkan konsep UML factory design pattern sebagai berikut

  1. AssetFactory (factory.go)
  2. Asset (asset.go)
  3. IAsset (iAsset.go)
  4. Concrete Product Bangunan (bangunan.go)
  5. Concrete Product Tanah (tanah.go)
  6. Concrete Product Kendaraan (kendaraan.go)
  7. 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())
}

Output

output-factory