Creational
Pattern
Factory Method, Abstract
Factory, Singleton
D
esign
P
attern
PPP
Tujuan Perkuliahan
Memahami creational pattern : Factory Method
Memahami creational pattern : Abstract Factory
Mulai dari sini, seluruh peserta mata kuliah PPP akan
mempelajari jenis – jenis PPP berdasarkan kategorisasi
GoF
Diperlukan kemampuan pemrograman yang
mumpuni serta pemahaman tentang pemodelan
dan pemrograman berorientasi objek yang
cukup baik
PPP
Factory
Method
Tujuan
Mendefinisikan antarmuka untuk menciptakan sebuah objek,
tetapi “membiarkan” subklas yang memutuskan klas mana
yang akan diinstansiasi
Factory Method memungkinkan sebuah
pendelegasian
tanggung jawab instansiasi sebuah klas tertentu oleh subklas
Juga dikenal sebagai:
Virtual Constructor
Motivasi (1)
PPP
Factory Method
Design should be “open for extension but closed for modification”
Bagaimana agar bisa membuat pizza lebih dari satu jenis ?
Digunakan Abstract class atau Interface ?
Motivasi (2)
PPP
Factory Method
Sekarang kita lewatkan tipe pizza ke method orderPizza
Berdasarkan tipe pizza, kita instansiasi concrete class yang sesuai dan kita masukkan pada variabel instance dari pizza
Setiap pizza disini harus
mengimplementasikan interface Pizza
Kemudian setelah kita memiliki objek Pizza, maka akan disiapkan agar siap dimasak,
dipotong kemudian mungkin akan dibungkus Setiap subtipe dari Pizza, seperti CheesePizza, VeggiePizza dll. “mengetahui” cara untuk
Motivasi (3)
PPP
Factory Method
Ini merupakan bagian yang
menjelaskan tentang setiap tipe pizza yang ada, misalkan jika ada perubahan tipe maka kita harus merubahnya terus – menerus sesuai dengan perubahan tersebut
Kemudian bagian ini akan selalu sama setiap waktu, karena proses persiapan, memasak dan pembungkusan akan selalu sama setiap waktu
Sehingga kode bagian ini tidak akan berubah
Bagaimana jika ada perubahan jenis pizza ? Harus “membuka” hard code ?
Motivasi (4)
PPP
Factory Method
Kemudian agar lebih efisien kita coba untuk “memisahkan” kode dengan cara menarik keluar kode untuk proses pembuatan objek dari method
orderPizza
Motivasi (5)
PPP
Factory Method
Motivasi (6)
PPP
Factory Method
Sekarang kita buat reference dari klas Pizza Store ke klasSimplePizzaFactory
PizzaStore mendapatkan informasi factory yang dilewatkan melalui konstruktornya
Dan method orderPizza() digunakan oleh factory untuk membuat pizza dengan cara yang sederhana, hanya dengan melewatkan tipenya saja
Sebagai catatan, kita sudah mengganti
operator baru dengan cara membuat method
pada objek factory, sehingga tidak perlu lagi ada instansiasi klas konkrit disini
Pemakaian / Applicability
Sebuah klas tidak dapat mengantisipasi objek dari klas mana
yang harus diinstansiasi
Sebuah klas ingin subklasnya yang mempunyai tanggung
jawab untuk menentukan objek mana yang klas tersebut harus
ciptakan
Klas mendelegasikan tanggung jawab tersebut pada salah satu
dari beberapa subklas pembantu
Kemudian kita sendiri ingin melokalisasi (menemukan)
pengetahuan subklas pembantu mana yang dimaksud atau
subklas pembantu mana yang menjadi delegasi tersebut
Struktur
PPP
Factory Method
Creator adalah klas yang berisi implementasi dari semua
method yang dapat
memanipulasi product, selain untuk method dari factory
Method abstrak
factoryMethod() yang harus diimplementasikan oleh setiap subklas
Klas ConcreteCreator yang mengimplementasikan method factoryMethod(), yang sebenarnya adalah method yang “memproduksi” product Klas ConcreteCreator inilah yang bertanggung jawab untuk
membuat 1 atau lebih concrete product
Ini adalah satu-satunya klas yang memiliki pengetahuan tentang bagaimana cara membuat product
Semua product harus mengimplementasikan interface yang sama sehingga klas yang yang ingin
menggunakan product dapat berkomunikasi dengan antarmukanya, bukan ke klas konkrit secara langsung
Partisipan / Penyusun
Product
mendefinisikan antarmuka dari objek yang diciptakan oleh factory method
Concrete Product
mengimplementasikan antarmuka product
Creator
Mendefinisikan factory method yang mengembalikan objek berupa jenis dari produk
dapat berisi implementasi standar dari factory method
bergantung pada subklasnya untuk mendefinisikan factory method sehingga dapat mengembalikan sebuah instance dari
ConcreteProduct yang sesuai
ConcreteCreator
Meng-override factory method untuk dapat mengembalikan instance dari ConcreteProduct
Kolaborasi
Creator bergantung pada subklasnya untuk mendefinisikan
factory method sehingga mengembalikan sebuah instance dari
ConcreteProduct yang tepat
Konsekuensi
Factory menghilangkan kebutuhan untuk mengikat kelas
khusus dari aplikasi (application specific classes) ke dalam
kode kita
hanya berkaitan dengan antarmuka Product,
sehingga dapat bekerja dengan beragam klas ConcreteProduct
yang ditetapkan pengguna
Kelemahan potensialnya adalah klien mungkin harus
melakukan penurunan klas Creator terlebih dahulu hanya untuk
membuat objek ConcreteProduct tertentu
Implementasi
Ada 2 variasi yang dapat dilakukan
Creator adalah klas abstrak dan tidak menyediakan implementasi
untuk factory method
membutuhkan sub-klas untuk
mendefinisikan implementasinya, tetapi kita tidak perlu
menginstansiasi klas yang sifatnya tidak terduga
Creator adalah kelas konkrit dan menyediakan implementasi
default untuk factory method
Creator menggunakan factory
method terutama untuk isu fleksibilitas, yang memungkinkan
sub-klas mengubah kelas dari objek yang kelas parentnya
diinstansiasi jika diperlukan
Implementasi
Factory method dengan parameter
Membuat beberapa jenis product berdasarkan parameter yang
diberikan
Semua objek yang diciptakan oleh factory method menciptakan
berbagi antarmuka Product yang sama
PPP
Factory Method
class Creator {
Product FactoryMethod(ProductID id){
if(id==MINE) return new MyProduct();
if(id==YOURS) return new YourProduct();
}
Contoh Kode (1)
Contoh Kode (2)
Contoh Kode (3)
Contoh Kode (4)
Contoh Kode (5)
Contoh Kode (6)
Contoh Kode (7)
PPP
Abstract
Factory
Tujuan
Mendefinisikan sebuah antarmuka untuk menciptakan 1
rumpun objek yang sifatnya saling terkait atau saling
tergantung tanpa menspesifikkan kelas konkritnya
Juga dikenal sebagai
Kit
Motivasi
Pertimbangkan pizza yang diproduksi oleh toko yang berbeda
Setiap pizza harus memiliki bahan-bahan berkualitas baik
sesuai dengan toko masing-masing → toko yang berbeda
memiliki bahan – bahan yang berbeda juga
Untuk menjadi lebih portabel di toko yang berbeda, pizza
seharusnya tidak di
hard-code
untuk bahan dari toko tertentu
Sebuah sistem harus
independen
dari bagaimana produk
tersebut dibuat, disusun dan direpresentasikan
Sebuah sistem harus dapat dikonfigurasi dengan salah satu
dari beberapa produk yang serumpun
Produk – produk yang serumpun ini dirancang untuk dapat
digunakan
bersama-sama
, dan kita perlu untuk memastikan
hal ini
Kita ingin menyediakan pustaka klas dari produk tersebut dan
kita hanya ingin “mengungkap” antarmukanya saja, bukan
implementasinya
Struktur
Partisipan / Penyusun
AbstractFactory
mendefiniskan sebuah antarmuka untuk operasi-operasi yang bertujuan membuat objek produk abstrak
ConcreteFactory
mengimplementasikan operasi untuk menciptakan ConcreteProduct
AbstractProduct
mendefinisikan sebuah antarmuka untuk 1 jenis produk
ConcreteProduct
mendefinisikan objek produk yang akan dibuat oleh ConcreteFactory tertentu
mengimplementasikan antarmuka AbstractProduct
Client
hanya dapat menggunakan antarmuka yang didefinisikan oleh AbstractFactory dan AbstractProduct
Kolaborasi
Biasanya satu instance dari klas ConcreteFactory dibuat pada saat
run-time
ConcreteFactory diimplementasikan sebagai Singleton
Pabrik abstrak mendelegasikan proses penciptaan objek produk
kepada sub-klas ConcreteFactory,
dengan menggunakan pola
Factory Method
Imeplementasi
Factory sebagai Singleton
sebuah aplikasi biasanya hanya
membutuhkan satu instance dari ConcreteFactory per 1 rumpun
keluarga produk
Singleton
Membuat Product : Abstract Factory hanya mendefinisikan sebuah
antarmuka untuk proses penciptaan produk
semuanya “terserah”
atau diserahkan
pada kepada sub-klas ConcreteProduct untuk
benar-benar membuat Product tersebut
Konsekuensi
AbstractFactory
dapat “mengisolasi” klas-klas
Ini membantu kita untuk mengontrol kelas objek yang diciptakan
oleh aplikasi
Ini dapat mengisolasi Client untuk mengakses implementasi dari
klas dan memanipulasinya langsung, Client hanya dapat
berkomunikasi dengan klas-klas tersebut melalui antarmuka
abstrak yang sudah didefinisikan
Hal ini membuat
pertukaran antar rumpun produk yang masih
sekeluarga menjadi lebih mudah
klas ConcreteFactory
hanya muncul sekali dalam aplikasi
Hal ini membuat perubahan pada ConcreteFactory yang
digunakan oleh aplikasi menjadi lebih mudah
Hal ini dapat membuat penggunaan konfigurasi produk yang
berbeda menjadi lebih mudah karena hanya dengan mengubah
ConcreteFactory-nya saja
Konsekuensi
“Mempromosikan” konsistensi antar produk
Ketika serumpun keluarga objek produk dirancang untuk dapat
bekerja sama, maka yang perlu diingat adalah bahwa aplikasi
hanya dapat menggunakan satu keluarga pada suatu waktu
Dukungan untuk produk jenis baru menjadi agak sulit
Memperluas
tugas AbstractFactory untuk
menghasilkan jenis
produk baru menjadi sangat sulit
karena antarmuka
AbstractFactory adalah tetap dan pasti hanya untuk serangkaian
produk yang sudah didefinisikan sebelumnya
Dukungan terhadap produk baru membutuhkan proses
memperluas antarmuka Factory, yang juga harus mengubah
kelas AbstractFactory dan semua subklas ConcreteFactory
Contoh Kode (1)
Contoh Kode (2)
Contoh Kode (3)
Contoh Kode (4)
Perbandingan Abstract Factory dan Factory Method
AbstractFactory
Creator
ConcreteFactory
ConcreteCreator
AbstractProduct
Product
Product
ConcreteProduct
PPP
Abstract Factory
PPP
Tujuan
Memastikan sebuah klas hanya dapat memiliki satu instance
dan memberikan titik akses global padanya
Motivasi:
Beberapa kelas harus memiliki tepat satu instance (satu
spooler cetak, satu sistem file, satu window manager)
Bagaimana kita memastikan bahwa sebuah klas hanya dapat
memiliki satu instance yang mudah diakses ?
Sebuah variabel global membuat sebuah objek mudah diakses
namun tidak dapat “melarang” instansiasi lebih dari 1 objek
Klas itu sendirilah yang harus bertanggung jawab untuk
melacak instance yang dihasilkan oleh klas tersebut
Pemakaian
Harus ada tepat satu instance dari klas dan objek hasil
instansiasi tersebut harus dapat diakses oleh klien dari jalur
akses biasa
Ketika satu-satunya instance tersebut harus “diperluas” oleh
subklasnya maka klien harus dapat menggunakan instance
yang sudah diperluas tersebut tanpa harus memodifikasi
kodenya
Struktur
Partisipan / Penyusun
Singleton
Mendefinisikan sebuah instance yang memungkinkan klien
mengakses antarmukanya yang unik
Instance adalah sebuah kelas operasi (static di Java)
Bertanggung jawab untuk menciptakan instance yang unik
Kolaborasi
Client
Mengakses instance Singleton hanya melalui method Instance()
Konsekuensi
Akses terkontrol ke instance tunggal
Karena klas Singleton mengenkapsulasi instancenya maka dia memiliki kontrol yang ketat atas bagaimana dan kapan klien harus mengaksesnya
Mengurangi name space
Pola Singleton adalah perbaikan dari variabel global menghindari penggunaan name space dari variabel global yang menyimpan instance tunggal
Memudahkan proses representasi operasi
Klas Singleton dapat di-inheritance dengan sangat mudah, dan jika ingin mengkonfigurasi aplikasi yang menggunakan instance dari klas yang diperluas ini kita dapat mengkonfigurasi aplikasi hanya dengan sebuah instance dari klas yang kita butuhkan pada saat run-time
Memungkinkan adanya variable number of instances
pola ini memudahkan jika kita ingin punya lebih dari satu instance dari kelas Singleton