Rabu, 04 April 2012

Abstract Factory

Abstract Factory Pattern (AFP) merupakan salah satu jenis Creational Pattern yang menangani mekanisme penciptaan obyek secara adaptif. AFP memberikan kemampuan pengenkapsulasian sekelompok factory dimana masing-masing factory memiliki “motif” khasnya. AFP menjadi sentral penentuan factory yang akan diinisialisasi sehingga product yang diciptakan dapat mewarisi behaviour yang sesuai dengan motif yang dipilih. Keistimewaan lain adalah product yang diciptakan terbebas dari pernyataan penciptaan concrete class secara langsung. Hal ini memberikan keuntungan yaitu AFP dapat mencegah coupling problem yang pasti terjadi apabila penciptaan obyek memakai operator new dalam bahasa OOP.
Abstract Factory PatternRahasia dibalik kemampuan AFP ini terletak pada penyediaan abstraksi terhadap factorydan product yang dihasilkan. Abstract factorymemberikan sekumpulan abstract method untuk menciptakan jenis product tertentu yang harus diimplementasikan oleh concrete factoryAbstract product memberikan abstraksi pada keluarga product yang berbeda motif dimana tentunya memiliki cara pengimplementasian yang berbeda pula. Istilah “motif” dalam paragraf-paragraf sebelumnya diartikan sebagai suatu themeatau corak khusus yang melekat pada suatuproduct. Untuk memperjelas, katakanlah terdapat suatu abstract factory bernama ToyFactory yang menyediakan fungsi penciptaan beberapa product (misalnya:createRaceCar() dan createCuteDoll()). Sistem kemudian menarik turunan ToysFactory karena adanya kebutuhan atas corak khusus tertentu, yaitu WoodenToyFactory dan ElectricToyFactory; dimana keduanya mampu menciptakan jenis mainan yang berbeda motif (seperti WoodenRaceCar dan WoodenCuteDoll; atau ElectricRaceCar dan ElectricCuteDoll). Wooden dan Electric adalah contoh dari motif yang dimaksudkan. Keberadaan motif umumnya yang menjadi pemicu pemanfaatan AFP dalam software design dimana setiap concrete factory mampu menciptakan berbagaiconcrete product tetapi dalam kesamaan satu jenis motif. Pada praktik pemakaian AFP, program client akan menginisialisasi suatu implementasi dari abstract factory dan kemudian menggunakan interface abstract product ketika ingin memperoleh atau bekerja dengan obyek konkrit product.
Factory Matrix
Dua hal yang perlu ada dalam memakai pattern ini adalah kehadiran product dan motif. Product tentunya berkaitan dengan object apa yang akan diciptakan oleh factory. Dan motif berkaitan dengan adanya kemungkinan product tersebut memiliki cara implementasi yang berbeda dilihat dari jenis teknologi atau alternatif implementasi lain yang membuatnya memiliki corak yang berbeda. Selain dua hal pokok tersebut, penggunaan pattern ini dimaksudkan untuk memberikan abstraksi saat menciptakan object sehingga membuatnya dapat independent terhadap program client. Untuk membantu merangkumnya dapat dipakaiFactory Matrix.
Factory Matrix
Gambar di atas memperlihatkan Factory Matrix dimana kepala-kolom menyatakan jenis motif dan kepala-baris menyatakan jenis product. Sebagai contoh kasus: ToysFactory memiliki dua jenis mainan (sebagaiproduct) yang dapat diciptakan yaitu Race Car dan Cute Doll. Padanya juga terdapat dua jenis motif yang ingin diterapkan untuk kedua jenis mainan tersebut yaitu Wooden dan Electric. Sel tempat pertemuan antara kolom dan baris merupakan concrete object dari satu jenis motif product mainan, contoh: WoodenRaceCar atau ElectricCuteDoll. Tentunya di setiap concrete object ini memiliki cara implementasi dari abstract behaviour yang berbeda-beda. Dari matriks ini kemudian dapat dipetakan ke class diagram dimana product akan menjadi AbstractProduct dan motif akan menjadi ConcreteFactoryLihat hasil pemetaan Factory Matrix ToysFactory ke UML class diagram.


berikut contoh penerapannya di php.
1
2
3abstract class Laptop_Factory
4{
5    abstract function netbook();
6    abstract function notebook();
7}
8
9class Asus_Factory extends Laptop_Factory
10{
11    function netbook()
12    {
13        return new Tipe_Netbook("Asus");
14    }
15    function notebook()
16    {
17        return new Tipe_Notebook("Asus");
18    }
19}
20
21class Acer_Factory extends Laptop_Factory
22{
23    function netbook()
24    {
25        return new Tipe_Netbook("Acer");
26    }
27    function notebook()
28    {
29        return new Tipe_Notebook("Acer");
30    }
31}
32
33abstract class Laptop_Tipe_Merk
34{
35    abstract function ambil_tipe();
36    abstract function ambil_merk();
37}
38
39class Tipe_Netbook extends Laptop_Tipe_Merk
40{
41    public $merk;
42    public $tipe = "Netbook";
43    function __construct($merk) {
44        $this->merk = $merk;
45    }
46
47    public function ambil_tipe()
48    {
49        return $this->tipe;
50    }
51
52    public function ambil_merk()
53    {
54        return $this->merk;
55    }
56}
57
58class Tipe_Notebook extends Laptop_Tipe_Merk
59{
60    public $merk;
61    public $tipe = "Notebook";
62    function __construct($merk) {
63        $this->merk = $merk;
64    }
65
66    public function ambil_tipe()
67    {
68        return $this->tipe;
69    }
70
71    public function ambil_merk()
72    {
73        return $this->merk;
74    }
75}
76
77class Pilihan_Konsumen
78{
79
80    public static function Create_Laptop_Factory($factoryName)
81    {
82        switch($factoryName)
83        {
84            case "Acer" :
85                return new Acer_Factory();
86                break;
87            case "Asus" :
88                return new Asus_Factory();
89                break;
90        }
91    }
92}
93
94class Tampilkan
95{
96    function __construct($nama_merk)
97    {
98        $fc = Pilihan_Konsumen::Create_Laptop_Factory($nama_merk);
99        $netbook = $fc->netbook();
100        $notebook = $fc->notebook();
101        print_r($netbook);
102        echo '
'
;
103        print_r($notebook);
104        echo '

'
;
105    }
106}
107
108new Tampilkan("Asus");
109new Tampilkan("Acer");
110
111?>

0 komentar:

Posting Komentar