Jurnal Design Pattern II
Jurnal Design Pattern II
/** ""bstract #uilder" */
abstract class Pizza#uilder {
protected Pizza pizza;
public Pizza getPizza() {
return pizza;
/** "&oncrete#uilder" */
class 'a%aiianPizza#uilder e(tends Pizza#uilder {
public void buildDough() {
pizza.setDough("cross");
/** "&oncrete#uilder" */
class Spic+Pizza#uilder e(tends Pizza#uilder {
public void buildDough() {
pizza.setDough("pan ba,ed");
/** "Director" */
class &oo, {
private Pizza#uilder pizza#uilder;
public void setPizza#uilder(Pizza#uilder pb) {
pizza#uilder = pb;
/** " given t+pe o- pizza being constructed. */
public class #uilder.(a)ple {
public static void )ain(String/0 args) {
&oo, coo, = ne% &oo,();
Pizza#uilder ha%aiianPizza#uilder = ne%
'a%aiianPizza#uilder();
Pizza#uilder spic+Pizza#uilder = ne%
Spic+Pizza#uilder();
coo,.setPizza#uilder(ha%aiianPizza#uilder);
coo,.constructPizza();
Pizza pizza = coo,.getPizza();
Python
1 Product
class Pizza2
de- 33init33(sel-)2
sel-.dough = $one
sel-.sauce = $one
sel-.topping = $one
de- set3dough(sel-4 dough)2
sel-.dough = dough
de- set3sauce(sel-4 sauce)2
sel-.sauce = sauce
de- set3topping(sel-4 topping)2
sel-.topping = topping
1 "bstract #uilder
class Pizza#uilder2
de- 33init33(sel-)2
sel-.pizza = $one
de- get3pizza(sel-)2
return sel-.pizza
de- create3ne%3pizza3product(sel-)2
sel-.pizza = Pizza()
1 &oncrete#uilder
class 'a%aiianPizza#uilder(Pizza#uilder)2
de- build3dough(sel-)2
sel-.pizza.set3dough("cross")
de- build3sauce(sel-)2
sel-.pizza.set3sauce(")ild")
de- build3topping(sel-)2
sel-.pizza.set3topping("ha)*pineapple")
1 Director
class &oo,2
de- 33init33(sel-)2
sel-.pizza3builder = $one
de- set3pizza3builder(sel-4 pb)2
sel-.pizza3builder = pb
de- get3pizza(sel-)2
return sel-.pizza3builder.get3pizza()
de- construct3pizza(sel-)2
sel-.pizza3builder.create3ne%3pizza3product()
sel-.pizza3builder.build3dough()
sel-.pizza3builder.build3sauce()
sel-.pizza3builder.build3topping()
1 " given t+pe o- pizza being constructed.
i- 33na)e33 == 533)ain3352
coo, = &oo,()
coo,.set3pizza3builder('a%aiianPizza#uilder())
coo,.construct3pizza()
pizza = coo,.get3pizza()
&. Factory 'ethod Pattern
:engan membuat Factory /ethod dan mendefinisikan sebua class
interface, kita bisa men/generate ob(ect yang dinamis sesuai kebutuan dan
implementasi yang diinginkan. 2arap di/ingat lagi, ruang lingkup dari Factory
/ethod adala class, Factory /ethod sendiri adala class ob(ect yang static.
Conto di bawa menggambarkan bagaimana 0b(ectFactory memanfaatkan
class interface ob(ect men.adi lebi dinamis. Conto lain implementasi
pattern ini adala BorderFactory atau ,ocketFactory yang merupakan
standart package $a-a .P1.
0bser-er Pattern menerapkan mekanisme Publisher dan ,ubscriber untuk
mengatur bagaimana sebua ob(ect mengetaui perubaan state di ob(ect
lainnya.
Factory 'atri(
:ua al yang perlu ada dalam memakai pattern ini adala keadiran
product dan motif. Product tentunya berkaitan dengan ob(ect apa yang
akan diciptakan ole factory. :an motif berkaitan dengan adanya
kemungkinan product tersebut memiliki cara implementasi yang berbeda
diliat dari .enis teknologi atau alternatif implementasi lain yang membuatnya
memiliki corak yang berbeda. Selain dua al pokok tersebut, penggunaan
pattern ini dimaksudkan untuk memberikan abstraksi saat menciptakan
ob(ect seingga membuatnya dapat independent teradap program client.
6ntuk membantu merangkumnya dapat dipakai Factory /atri2.
;ambar *. &actory Matri-
;ambar di atas memperliatkan &actory Matri- dimana kepala/kolom
menyatakan .enis motif dan kepala/baris menyatakan .enis product.
Sebagai conto kasus# #oys Factory memiliki dua .enis mainan 'sebagai
product( yang dapat diciptakan yaitu )ace Car dan Cute Doll. Padanya .uga
terdapat dua .enis motif yang ingin diterapkan untuk kedua .enis mainan
tersebut yaitu *ooden dan +lectric.
Sel tempat pertemuan antara kolom dan baris merupakan concrete ob(ect
dari satu .enis motif product mainan, conto# 3ooden"ace*ar atau
!lectric*uteDoll. 7entunya di setiap concrete ob(ect ini memiliki cara
implementasi dari abstract beha-iour yang berbeda/beda. :ari matriks ini
kemudian dapat dipetakan ke class diagram dimana product akan men.adi
.bstractProduct dan motif akan men.adi *oncrete Factory.
;ambar +. 2asil pemetaan &actory Matri- 7oys&actory
ke 6M< class diagram.
,. Prototype pattern
Sebua prototype pattern adala sebua design pattern kreatif yang
digunakan dalam pengembangan perangkat lunak. =enis ob(ect untuk
membuat ob(ect baru ditentukan ole prototype conto. 0b(ect di kloning
untuk mengasilkan ob(ect baru.
Pattern ini digunakan untuk#
mengindari subclass dari ob(ect kreator dalam aplikasi klien, tidak
seperti abstract factory pattern.
mengindari biaya yang melekat (inherent cost) dari ob(ect baru
yang dibuat sesuai standar 'misalnya, dengan menggunakan
keyword > ne >(, saat biaya itu cukup maal untuk aplikasi tertentu.
6ntuk mengimplementasikan pattern, deklarasikan sebua abstract base
class yang menentukan sebua pure -irtual clone () method. Setiap class
yang memerlukan sebua 0polymorphic constructor1, maka kemampuan itu
berasal dari class abstract base dirinya sendiri, dan mengimplementasikan
operasi clone ().
Klien, bukanya menulis kode yang meminta operator ?new? pada sebua
hard-coded class name, memanggil method clone () pada prototipe,
memanggil sebua factory method dengan sebua parameter tertentu yang
menun.uk particular concrete kelas turunan yang diinginkan, atau
mengacu pada method clone () melalui beberapa mekanisme yang
disediakan ole design pattern lain.
Contoh
Prototype Pattern menentukan .enis ob(ect untuk membuat sebua prototype
conto. Prototipe produk baru sering dibangun sebelum memproduksi
masal, tetapi dalam conto ini, prototype adala pasif dan tidak
berpartisipasi dalam menyalin diri sendiri. Pembelaan mitosis sel /
berakibat dua sel identik, dan ini adala conto dari prototipe yang
memainkan peran aktif dalam menyalin dirinya sendiri dan al ini
menun.ukkan Prototype pattern. Ketika sebua sel membela diri, maka dua
sel yang identik asil genotype akan tercipta. :engan kata lain, sel tersebut
meng/klon dirinya sendiri. @Micael :uell, ?Aon/software e-amples of
software design patterns?, 0b(ect Magazine, =ul BC, p,+D.
Java
/**
* Protot+pe &lass
*/
public class &oo,ie i)ple)ents &loneable {
67verride
public &oo,ie clone() thro%s
&lone$otSupported.(ception {
// call Object.clone()
&oo,ie cop+ = (&oo,ie) super.clone();
//8n an actual i)ple)entation o- this pattern
+ou )ight no% change re-erences to
//the e(pensive to produce parts -ro) the copies
that are held inside the protot+pe.
return cop+;
/**
* &oncrete Protot+pes to clone
*/
public class &oconut&oo,ie e(tends &oo,ie {
/**
* &lient &lass
*/
public class &oo,ie9achine {
private &oo,ie coo,ie; // &ould have been a private
&loneable coo,ie.
public &oo,ie9achine(&oo,ie coo,ie) {
this.coo,ie = coo,ie;
public &oo,ie )a,e&oo,ie() {
return (&oo,ie) this.coo,ie.clone();
public static void )ain(String args/0) {
&oo,ie te)p&oo,ie = null;
&oo,ie prot = ne% &oconut&oo,ie();
&oo,ie9achine c) = ne% &oo,ie9achine(prot);
-or (int i = :; i ; <::; i**)
te)p&oo,ie = c).)a,e&oo,ie();
Python
i)port cop+
1
1 Protot+pe &lass
1
class &oo,ie2
de- 33init33(sel-4 na)e)2
sel-.na)e = na)e
de- clone(sel-)2
return cop+.deepcop+(sel-)
1
1 &oncrete Protot+pes to clone
1
class &oconut&oo,ie(&oo,ie)2
de- 33init33(sel-)2
&oo,ie.33init33(sel-4 5&oconut5)
1 &lient &lass
class &oo,ie9achine2
de- 33init33(sel-4 coo,ie)2
sel-.coo,ie = coo,ie
de- )a,e3coo,ie(sel-)2
return sel-.coo,ie.clone()
i- 33na)e33 == 533)ain3352
prot = &oconut&oo,ie()
c) = &oo,ie9achine(prot)
-or i in (range(<:)2
te)p3coo,ie = c).)a,e3coo,ie()
Aturan yang perlu diperhati-an
Kadang/kadang creational patterns tumpang tindi / ada kasus/kasus ketika
baik Prototype atau %bstract &actory akan sesuai. :i lain waktu mereka
saling melengkapi satu sama lain# %bstract &actory mungkin menyimpan set
Prototype dari yang untuk mengkloning dan produk kembali ob(ect ';3&,
p$)E(. %bstract &actory, Builder, dan Prototipe dapat menggunakan
Singleton dalam implementasi. ';o&, pF$, $*+(. ';3&, pF$, $*+(. %bstract
&actory classes sering dilaksanakan dengan Metode Pabrik 'penciptaan
melalui pewarisan(, tetapi mereka dapat diimplementasikan dengan
menggunakan Prototype 'ciptaan melalui delegasi(. ';o&, pB,( ';3&, pB,(
Sering kali, desain awal dengan menggunakan Metode Pabrik 'kurang rumit,
lebi disesuaikan, subclass berkembang biak( dan berkembang ke ara
%bstract &actory, Prototype, atau Builder 'lebi fleksibel, lebi kompleks(
sebagai perancang menemukan di mana fleksibilitas lebi dibutukan. ';o&,
p$*E( ';3&, p$*E(
Prototype tidak memerlukan subclassing, tapi itu tidak memerlukan sebua
?initialize? operasi. Metode factory memerlukan subclassing, tapi tidak
memerlukan inisialisasi. ';o&, p$$E( ';3&, p$$E(
:esain yang membuat penggunaan berat Composite dan decorator pattern
sering dapat memperole manfaat dari Prototype .uga. ';o&, p$)E( ';3&,
p$)E(
4ule of tumb bisa .adi %nda akan perlu untuk mengkloning '( sebua
0b(ect ketika %nda ingin membuat 0b(ect lain pada saat runtime yang
merupakan sebua true copy 0b(ect kloning %nda. True copy berarti seluru
atribut yang baru dibuat arus 0b(ect yang sama dengan 0b(ect yang %nda
kloning. =ika %nda bisa instantiated class dengan menggunakan bukan baru,
%nda akan mendapatkan 0b(ect dengan semua atribut sebagai nilai awal.
Sebagai conto, .ika %nda merancang suatu sistem untuk melakukan
transaksi rekening bank, maka %nda akan ingin untuk membuat salinan dari
0b(ect yang memegang informasi account %nda, melakukan transaksi di
atasnya, dan kemudian mengganti 0b(ect asli dengan yang diuba satu.
:alam kasus tersebut, %nda akan ingin menggunakan clone '( bukan baru.
.. /ingleton Pattern
,ingleton pattern adala design pattern yang digunakan untuk membatasi
instanisasi dari suatu kelas men.adi satu ob(ect, membatasi sebua global
point of access ke suatu ob(ect dan memperbolekan multiple instances ke
depan tanpa mempengarui singleton class client. 7erkadang suatu sistem
akan beroperasi lebi efisien .ika anya ada satu atau beberapa ob(ect sa.a.
,ingleton pattern diimplementasikan dengan membuat class dengan
method yang membuat instance class yang baru .ika instance belum ada.
=ika instance suda ada maka akan diarakan ob(ect yang tela ada. 6ntuk
mencega ob(ect tidak instankan berkali/kali maka constructor diruba
men.adi pri-ate atau protected, protected constructor bisa dipanggil ole
subclass dan class yang berada dalam satu package, .ika pri-ate
constructor maka anya bisa dipanggil ole class itu sendiri tetapi itu berarti
class tersebut tidak bisa di subclass/kan.
/*
public class satu {
private static -inal satu instance = ne% satu();
/** &reates a ne% instance o- satu */
private satu() {
S+ste).out.println("satu");
public static satu get8nstance() {
return instance;
/*
* dua.=ava
public class dua {
/** &reates a ne% instance o- dua */
public dua() {
public static void )ain(String/0 args)
{
satu s = satu.get8nstance();
:%&7%4 P6S7%K%
)GGF, 5ntroducing 7o :esign Pattern, ttp#""ale-budiyanto.web.id"introducing/
to/design/pattern.tml
ttp#""en.wikipedia.org"wiki"BuilderHpattern
%pa itu Abstract Factory Pattern?
ttp#"".osef.web.id"se")GGC"G,"GE"apa/itu/abstract/factory/pattern"
Gamma, Erich; Helm, ichar!; "ohnson, alph; #lissi!es, "ohn
$1%%&'. Design Patterns: Elements of Reusable Object-
Oriented Software. (!!ison)*esle+. ,-./ 0)201)12211)2.