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.
Rahasia 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 factory. Abstract 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.
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 ConcreteFactory. Lihat hasil pemetaan Factory Matrix ToysFactory ke UML class diagram.
berikut contoh penerapannya di php.
berikut contoh penerapannya di php.
1 |
|
2 |
3 | abstract class Laptop_Factory |
4 | { |
5 | abstract function netbook(); |
6 | abstract function notebook(); |
7 | } |
8 |
9 | class 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 |
21 | class 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 |
33 | abstract class Laptop_Tipe_Merk |
34 | { |
35 | abstract function ambil_tipe(); |
36 | abstract function ambil_merk(); |
37 | } |
38 |
39 | class 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 |
58 | class 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 |
77 | class 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 |
94 | class 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 |
108 | new Tampilkan( "Asus" ); |
109 | new Tampilkan( "Acer" ); |
110 |
111 | ?> |