Tutorial Design Pattern : Penerapan Design Pattern Abstract Factory di PHP

Akhirnya acara pelatihan desain grafis di kampus berakhir juga. Berhubung sedikit yang datang dan jajan yang disediakan banyak, jadilah sebagian saya gondol pulang. Lumayan, buat stok begadang nanti malam :p. Tumben peserta yang ikut sedikit, panitia dan anggota UKM juga sedikit yang datang. Sebagian anggota UKM berangkat ke sekolah lain untuk mengadakan workshop tentang linux. Biar sajalah, yang penting jajannya masih ada sisa untuk saya :). Ketika acara penutupan tadi, baru kali ini saya mendengar pak ketua kampus yang baru berbicara di depan. Entah kenapa, terlihat cukup berwibawa semenjak menjabat sebagai ketua (wiiiiii, bawa komputer tablet :ngakaks:). Pada kesempatan kali ini, saya akan melanjutkan postingan tentang design pattern dan sekarang gilirannya si Abstract Factory untuk dibahas. Abstract Factory ini masih berhubungan dengan Factory Method yang sudah saya sempat bahas kemarin. Abstract Factory mendefinisikan setiap Factory Method per setiap produknya dan setiap Factory Method merangkum operator baru. Abstract Factory menyediakan sebuah interface untuk menciptakan obyek yang terkait tanpa perlu menentukan class nyatanya.

Disini saya contohkan sebuah laptop jaman sekarang terdapat 2 jenis, yaitu netbook dan notebook. Keduanya mempunyai ukuran dan klasifikasi tersendiri, bahasa kasarnya itu cetakan yang diperlukan sama untuk berbagai netbook dan notebook dengan merk yang berbeda. Ketika ada 2 produsen laptop, yaitu Acer dan Asus ingin memproduksi netbook dan notebook, mereka hanya tinggal mencontoh ukuran dan klasifikasi yang sudah disediakan (dalam hal ini ialah class Abstract Laptop_Factory). Kedua produsen tersebut hanya perlu menyediakan stampel merk dan tipe laptop yang ingin dibuat entah itu netbook atau notebook (dalam hal ini ialah class Abstract Laptop_Tipe_Merk). Dan di sisi konsumen, mereka hanya perlu menyebutkan merk dan tipe laptop (netbook atau notebook) yang ingin dibuat/dipesan. Maka akan diproduksi lah sebuah laptop sesuai pesanan si konsumen. Cukup jelaslah hasil penerawangan saya tentang design pattern yg satu ini ;). Sekarang kita lanjut ke penerapannya di php.

<?php

abstract class Laptop_Factory
{
    abstract function netbook();
    abstract function notebook();
}

class Asus_Factory extends Laptop_Factory
{
    function netbook()
    {
        return new Tipe_Netbook("Asus");
    }
    function notebook()
    {
        return new Tipe_Notebook("Asus");
    }
}

class Acer_Factory extends Laptop_Factory
{
    function netbook()
    {
        return new Tipe_Netbook("Acer");
    }
    function notebook()
    {
        return new Tipe_Notebook("Acer");
    }
}

abstract class Laptop_Tipe_Merk
{
    abstract function ambil_tipe();
    abstract function ambil_merk();
}

class Tipe_Netbook extends Laptop_Tipe_Merk
{
    public $merk;
    public $tipe = "Netbook";
    function __construct($merk) {
        $this->merk = $merk;
    }

    public function ambil_tipe()
    {
        return $this->tipe;
    }

    public function ambil_merk()
    {
        return $this->merk;
    }
}

class Tipe_Notebook extends Laptop_Tipe_Merk
{
    public $merk;
    public $tipe = "Notebook";
    function __construct($merk) {
        $this->merk = $merk;
    }

    public function ambil_tipe()
    {
        return $this->tipe;
    }

    public function ambil_merk()
    {
        return $this->merk;
    }
}

class Pilihan_Konsumen
{

    public static function Create_Laptop_Factory($factoryName)
    {
        switch($factoryName)
        {
            case "Acer" :
                return new Acer_Factory();
                break;
            case "Asus" :
                return new Asus_Factory();
                break;
        }
    }
}

class Tampilkan
{
	function __construct($nama_merk)
	{
		$fc = Pilihan_Konsumen::Create_Laptop_Factory($nama_merk);
		$netbook = $fc->netbook();
		$notebook = $fc->notebook();
		print_r($netbook);
		echo '<br>';
		print_r($notebook);
		echo '<br><br>';
	}
}

new Tampilkan("Asus");
new Tampilkan("Acer");

?>

Sesuai yang saya kutip dari buku Gang of Four Design Pattern, class dan object di atas masuk ke beberapa kriteria di bawah ini :

  • AbstractFactory (Laptop_Factory)
  • ConcreteFactory(Asus_Factory, Acer_Factory)
  • AbstractProduct(Laptop_Tipe_Merk)
  • Product(Tipe_Netbook, Tipe_Notebook)
  • Client(Pilihan_Konsumen)

Design pattern ini banyak sekali dipakai dalam ilmu software enginering dan saya baru tau kalau keampuhan Java Swing yang GUI-nya bisa berubah-ubah menggunakan konsep design pattern Abstract Factory ini. OK deh, sekian dulu postingan saya kali ini. Semoga bermanfaat untuk kita semua.

Happy Blogging and Keep Coding

Cheerrrss….!!!!