creational pattern - adamhendrabrata.files.wordpress.com · setiap pizza harus memiliki bahan-bahan...

45
C reational Pattern Factory Method, Abstract Factory , Singleton Design Pattern Adam Hendra Brata

Upload: doantu

Post on 18-Nov-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Creational

Pattern

Factory Method, Abstract

Factory, Singleton

Design

Pattern

Adam Hendra Brata

Page 2: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

PPP Tujuan Perkuliahan

Memahami creational pattern : Factory Method

Memahami creational pattern : Abstract Factory

Memahami creational pattern : Singleton

Page 3: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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 Peringatan

Page 4: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

PPP

Factory

Method

Page 5: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Factory Method

Page 6: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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 ?

Page 7: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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 mempersiapkan dirinya sendiri

Page 8: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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 jenispizza ? Harus “membuka” hard code ?

Page 9: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

Pizza Factory

Page 10: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Motivasi (5)

PPP Factory Method

Class terpisah

Page 11: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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 methodpada objek factory, sehingga tidak perlu lagi ada instansiasi klas konkrit disini

Page 12: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Factory Method

Page 13: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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 productIni 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

Page 14: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Factory Method

Page 15: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Factory Method

Page 16: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Factory Method

Page 17: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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();

}

}

Page 18: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (1)

PPP Factory Method

Page 19: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (2)

PPP Factory Method

Page 20: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (3)

PPP Factory Method

Page 21: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (4)

PPP Factory Method

Page 22: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (5)

PPP Factory Method

Page 23: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (6)

PPP Factory Method

Page 24: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (7)

PPP Factory Method

Page 25: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

PPP

Abstract

Factory

Page 26: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Abstract Factory

Page 27: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Abstract Factory

Page 28: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Struktur

PPP Abstract Factory

Page 29: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Abstract Factory

Page 30: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Abstract Factory

Page 31: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Abstract Factory

Page 32: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Abstract Factory

Page 33: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (1)

PPP Abstract Factory

Page 34: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (2)

PPP Abstract Factory

Page 35: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (3)

PPP Abstract Factory

Page 36: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode (4)

PPP Abstract Factory

Page 37: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Perbandingan Abstract Factory dan Factory Method

AbstractFactory Creator

ConcreteFactory ConcreteCreator

AbstractProduct Product

Product ConcreteProduct

PPP Abstract Factory

Page 38: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

PPP

Singleton

Page 39: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Singleton

Page 40: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Singleton

Page 41: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Struktur

PPP Singleton

Page 42: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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()

PPP Singleton

Page 43: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

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

PPP Singleton

Page 44: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Contoh Kode

PPP Singleton

Page 45: Creational Pattern - adamhendrabrata.files.wordpress.com · Setiap pizza harus memiliki bahan-bahan berkualitas baik sesuai dengan toko masing-masing → toko yang berbeda ... Sebuah

Web Services

Terimakasih

v^^

PPP

I’m with you tillthe end of the line