Pages

Jumat, 11 Mei 2012

Prototype pattern

Nim :1108100268

Prototype pattern
Sebuah prototype pattern adalah sebuah design pattern kreatif yang digunakan dalam pengembangan perangkat lunak. Jenis object untuk membuat object baru ditentukan oleh prototype contoh. Object di kloning untuk menghasilkan object baru.
Pattern ini digunakan untuk:

* menghindari subclass dari object kreator dalam aplikasi klien, tidak seperti abstract factory pattern.
* menghindari biaya yang melekat (inherent cost) dari object baru yang dibuat sesuai standar (misalnya, dengan menggunakan keyword 'new'), saat biaya itu cukup mahal untuk aplikasi tertentu.

Untuk mengimplementasikan pattern, deklarasikan sebuah abstract base class yang menentukan sebuah pure virtual clone () method. Setiap class yang memerlukan sebuah “polymorphic constructor”, maka kemampuan itu berasal dari class abstract base dirinya sendiri, dan mengimplementasikan operasi clone ().
Klien, bukanya menulis kode yang meminta operator "new" pada sebuah hard-coded class name, memanggil method clone () pada prototipe, memanggil sebuah factory method dengan sebuah parameter tertentu yang menunjuk particular concrete kelas turunan yang diinginkan, atau mengacu pada method clone () melalui beberapa mekanisme yang disediakan oleh design pattern lain.
Contoh
Prototype Pattern menentukan jenis object untuk membuat sebuah prototype contoh. Prototipe produk baru sering dibangun sebelum memproduksi masal, tetapi dalam contoh ini, prototype adalah pasif dan tidak berpartisipasi dalam menyalin diri sendiri. Pembelahan mitosis sel - berakibat dua sel identik, dan ini adalah contoh dari prototipe yang memainkan peran aktif dalam menyalin dirinya sendiri dan hal ini menunjukkan Prototype pattern. Ketika sebuah sel membelah diri, maka dua sel yang identik hasil genotype akan tercipta. Dengan kata lain, sel tersebut meng-klon dirinya sendiri. [Michael Duell, "Non-software examples of software design patterns", Object Magazine, Jul 97, p54].
Java

/**

* Prototype Class

*/

public class Cookie implements Cloneable {



@Override

public Cookie clone() throws CloneNotSupportedException {

// call Object.clone()

Cookie copy = (Cookie) super.clone();



//In an actual implementation of this pattern you might now change references to

//the expensive to produce parts from the copies that are held inside the prototype.



return copy;

}

}

/**

* Concrete Prototypes to clone

*/

public class CoconutCookie extends Cookie { }

/**

* Client Class

*/

public class CookieMachine {



private Cookie cookie; // Could have been a private Cloneable cookie.



public CookieMachine(Cookie cookie) {

this.cookie = cookie;

}



public Cookie makeCookie() {

return (Cookie) this.cookie.clone();

}



public static void main(String args[]) {

Cookie tempCookie = null;

Cookie prot = new CoconutCookie();

CookieMachine cm = new CookieMachine(prot);

for (int i = 0; i < 100; i++)

tempCookie = cm.makeCookie();

}

}

Python

import copy



#

# Prototype Class

#

class Cookie:

def __init__(self, name):

self.name = name



def clone(self):

return copy.deepcopy(self)



#

# Concrete Prototypes to clone

#

class CoconutCookie(Cookie):

def __init__(self):

Cookie.__init__(self, 'Coconut')



# Client Class

class CookieMachine:

def __init__(self, cookie):

self.cookie = cookie



def make_cookie(self):

return self.cookie.clone()



if __name__ == '__main__':

prot = CoconutCookie()

cm = CookieMachine(prot)

for i in xrange(10):

temp_cookie = cm.make_cookie()

Aturan yang perlu diperhatikan
Kadang-kadang creational patterns tumpang tindih - ada kasus-kasus ketika baik Prototype atau Abstract Factory akan sesuai. Di lain waktu mereka saling melengkapi satu sama lain: Abstract Factory mungkin menyimpan set Prototype dari yang untuk mengkloning dan produk kembali object (GOF, p126). Abstract Factory, Builder, dan Prototipe dapat menggunakan Singleton dalam implementasi. (GoF, p81, 134). (GOF, p81, 134). Abstract Factory classes sering dilaksanakan dengan Metode Pabrik (penciptaan melalui pewarisan), tetapi mereka dapat diimplementasikan dengan menggunakan Prototype (ciptaan melalui delegasi). (GoF, p95) (GOF, p95)
Sering kali, desain awal dengan menggunakan Metode Pabrik (kurang rumit, lebih disesuaikan, subclass berkembang biak) dan berkembang ke arah Abstract Factory, Prototype, atau Builder (lebih fleksibel, lebih kompleks) sebagai perancang menemukan di mana fleksibilitas lebih dibutuhkan. (GoF, p136) (GOF, p136)
Prototype tidak memerlukan subclassing, tapi itu tidak memerlukan sebuah "initialize" operasi. Metode factory memerlukan subclassing, tapi tidak memerlukan inisialisasi. (GoF, p116) (GOF, p116)
Desain yang membuat penggunaan berat Composite dan decorator pattern sering dapat memperoleh manfaat dari Prototype juga. (GoF, p126) (GOF, p126)
Rule of thumb bisa jadi Anda akan perlu untuk mengkloning () sebuah Object ketika Anda ingin membuat Object lain pada saat runtime yang merupakan sebuah true copy Object kloning Anda. True copy berarti seluruh atribut yang baru dibuat harus Object yang sama dengan Object yang Anda kloning. Jika Anda bisa instantiated class dengan menggunakan bukan baru, Anda akan mendapatkan Object dengan semua atribut sebagai nilai awal. Sebagai contoh, jika Anda merancang suatu sistem untuk melakukan transaksi rekening bank, maka Anda akan ingin untuk membuat salinan dari Object yang memegang informasi account Anda, melakukan transaksi di atasnya, dan kemudian mengganti Object asli dengan yang diubah satu. Dalam kasus tersebut, Anda akan ingin menggunakan clone () bukan baru.

Builder Patern

Nim :1108100268

Query Builder Patern menyediakan cara berorientasi objek dalam menulis statement SQL. Fitur ini membantu pengembang untuk menggunakan property dan method kelas untuk menentukan bagian-bagian dari statement SQL yang kemudian menggabungkannya menjasi sebuah statement SQL yang valid yang bisa dieksekusi lebih lanjut oleh method DAO seperti yang dideskripsikan di Data Access Objects. Berikut akan ditampilkan penggunaan umum dari Query Builder untuk membangun sebuah statement SQL SELECT:

$user = Yii::app()->db->createCommand()
->select('id, username, profile')
->from('tbl_user u')
->join('tbl_profile p', 'u.id=p.user_id')
->where('id=:id', array(':id'=>$id))
->queryRow();



Query Builder sangat cocok digunakan ketika Anda memerlukan menggabungkan sebuah statement SQL secara prosedural, atau berdasarkan suatu kondisi logis dalam aplikasi Anda. Manfaat utama dalam menggunakan Query Builder termasuk:

* Memungkinkan membangun statement SQL yang kompleks secara programatik
* Fitur ini akan memberikan quote pada nama table dan kolom secara otomatis guna mencegah konflik dengan tulisan SQL ataupun karakter khusus.
* Fitur ini juga memberikan quote pada nilai parameter dan melakukan binding pada parameter ketika memungkinkan, sehingga mengurangi resiko terserang SQL injection.
* Fitur ini menyediakan sekian tingkatan abstraksi pada DB, yang menyederhanakan migrasi ke platform DB yang berbeda.

Menggunakan Query Builder bukanlah sebuah keharusan. Bahkan, jika query Anda cukup sederhana, akan leih gampang dan cepat menulis SQL-nya langsung.

Catatan: Query builder tidak bisa digunakan untuk memodifikasi query yang sudah ada sebagai statement SQL. Misalnya, code berikut tidak akan berjalan:

$command = Yii::app()->db->createCommand('SELECT * FROM tbl_user');
// baris berikut tidak akan menambahkan WHERE ke klausa SQL di atas.
$command->where('id=:id', array(':id'=>$id));

Oleh karena itu, jangan campur penggunaan SQL biasa dengan query builder.

1. Mempersiapkan Query Builder
Query Builder Yii disediakan oleh CDbCommand, kelas query DB utama di Data Access Objects.
Untuk menggunakan Query Builder, kita membuat sebuah instance baru dari CDbCommand dengan cara berikut,

$command = Yii::app()->db->createCommand();

Begitulah, kita menggunakan Yii::app()->db untuk mendapatkan koneksi DB, kemudian melakukan pemanggilanpada CDbConnection::createCommand() untuk membuat instance command yang diperlukan.
Perhatikan bahwa alih-alih kita mem-pass semua statement SQL ke createCommand() seperti yang dilakukan di Data Access Objects, kita membiarkannya kosong. Ini dikarenakan kita akan membangun bagian-bagian individu dari statement SQL dengan menggunakan method Query Builder yang akan dijelaskan pada bagian berikut.

Berikut, Rudi akan menunjukkan bagaimana menggunakan method-method query builder ini. Supaya sederhana, kami mengasumsi database yang digunakan adalah MySQL. Perhatikan bahwa jika Anda menggunakan DBMS yang lain, quote table/kolom/nilai akan berbeda dengan contoh.
select()

function select($columns='*')

Method select() menentukan bagian SELECT pada query. Parameter $columns menentukan kolom-kolom apa saja yang akan di-select, yang bisa berupa string dengan nama kolom dipisah koma, atau sebuah array dari nama kolom. Nama kolom dapat berisi prefiks table dan/atau alias kolom. Method ini akan secara otomatis memberikan quote pada nama kolom kecuali kolom tersebut mengandung tanda kurung (yang bararti kolom yang diberikan merupakan ekspresi DB).
Berikut ini merupakan beberapa contoh:

// SELECT *
select()
// SELECT `id`, `username`
select('id, username')
// SELECT `tbl_user`.`id`, `username` AS `name`
select('tbl_user.id, username as name')
// SELECT `id`, `username`
select(array('id', 'username'))
// SELECT `id`, count(*) as num
select(array('id', 'count(*) as num'))

selectDistinct()

function selectDistinct($columns)

Method selectDistinct() mirip dengan select(). Hanya saja selectDistinct mengaktifkan flag DISTINCT. Misalnya, selectDistinct(id,username')` akan menghasilkan SQL berikut:

SELECT DISTINCT `id`, `username`

from()

function from($tables)

Method from() menentukan bagian FROM pada query. Parameter $tables menentukan table mana yang akan di-select. Yang ini juga bisa berupa string dengan nama table dipisahkan dengan koma, atau sebuah array dari nama table. Nama table dapat diambil dari prefiks skema (misalnya public.tbl_user) dan/atau alias table (misalnya tbl_user u). Method ini akan secara otomatis memberikan quote pada nama table kecuali nama table-nya mengandung huruf kurung (yang artinya berupa sub-query atau ekspresi DB).
Berikut merupakan beberapa contoh:

// FROM `tbl_user`
from('tbl_user')
// FROM `tbl_user` `u`, `public`.`tbl_profile` `p`
from('tbl_user u, public.tbl_profile p')
// FROM `tbl_user`, `tbl_profile`
from(array('tbl_user', 'tbl_profile'))
// FROM `tbl_user`, (select * from tbl_profile) p
from(array('tbl_user', '(select * from tbl_profile) p'))

where()

function where($conditions, $params=array())

Method where() menetapkan bagian WHERE pada query. Parameter $conditions menentukan kondisi query sedangkan $params menentukan parameter yang diikat pada keseluruhan query. Parameter $conditions dapat berupa sebuah string (misalnya id=1) atau sebuah array dengan format:

array(operator, operand1, operand2, ...)

dengan operatordapat bisa berupa :

* and: operan harus digabung dengan menggunakan AND. Misalnya array('and', 'id=1', 'id=2') akan menghasilkan id=1 AND id=2. Jika operan adalah array, maka akan diubah menjadi string dengan menggunakan aturan yang sama. Misalnya array('and', 'type=1', array('or', 'id=1', 'id=2')) akan menghasilkan type=1 AND (id=1 OR id=2). Method ini tidak akan memberikan quote ataupun escape character.
* or: mirip dengan operator and hanya saja operan-operan akan digabung dengan OR.
* in: Operan satu harus berupa kolom atau ekspresi DB, dan operan 2 harus berupa array yang merepresentasikan kumpulan nilai yang harus dipenuhi oleh kolom atau ekspresi DB. Misalnya array('in', 'id', array(1,2,3)) akan menghasilkan id IN (1,2,3). Method ini akan memberikan quote pada nama kolom dan nilai escape di dalam range.
* not in: mirip dengan operator in kecuali tulisan IN akan diubah dengan NOT IN di dalam kondisi yang di-generate.
* like: operan 1 harus berupa kolom atau ekspresi DB, dan operan 2 harus berupa string atau sebuah array yang mewakili range dari nilai-nilai di kolom atau ekspresi DB yang mirip. Misalnya, array('like', 'name', '%tester%') akan menghasilkan name LIKE '%tester%'. Ketika range nilai diberikan sebagai array, maka beberapa predikat LIKE akan di-generate dan digabungkan dengan menggunakan AND. Misalnya array('like', 'name', array('%test%', '%sample%')) akan menghasilkan name LIKE '%test%' AND name LIKE '%sample%'. Method ini akan memberikan quote pada nama kolom dan nilai escape pada range nilai.
* not like: mirip dengan operator like kecuali tulisan LIKE akan diganti dengan NOT LIKE pada kondisi yang dihasilkan.
* or like: mirip dengan operator like hanya saja tulisan OR yang digunakan untuk menggabungkan beberapa predikat LIKE.
* or not like: mirip dengan operator not like kecuali OR yang digunakan untuk menggabungkan predikat NOT LIKE.

Berikut merupakan beberapa contoh yang menggunakan where:

// WHERE id=1 or id=2
where('id=1 or id=2')
// WHERE id=:id1 or id=:id2
where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2))
// WHERE id=1 OR id=2
where(array('or', 'id=1', 'id=2'))
// WHERE id=1 AND (type=2 OR type=3)
where(array('and', 'id=1', array('or', 'type=2', 'type=3')))
// WHERE `id` IN (1, 2)
where(array('in', 'id', array(1, 2))
// WHERE `id` NOT IN (1, 2)
where(array('not in', 'id', array(1,2)))
// WHERE `name` LIKE '%Qiang%'
where(array('like', 'name', '%Qiang%'))
// WHERE `name` LIKE '%Qiang' AND `name` LIKE '%Xue'
where(array('like', 'name', array('%Qiang', '%Xue')))
// WHERE `name` LIKE '%Qiang' OR `name` LIKE '%Xue'
where(array('or like', 'name', array('%Qiang', '%Xue')))
// WHERE `name` NOT LIKE '%Qiang%'
where(array('not like', 'name', '%Qiang%'))
// WHERE `name` NOT LIKE '%Qiang%' OR `name` NOT LIKE '%Xue%'
where(array('or not like', 'name', array('%Qiang%', '%Xue%')))

Perhatikan bahwa ketika menggunakan operator like, kita harus menentukan karakter wildcard secara eksplisit (seperti % dan _) . JIka polanya berasal dari input user, maka kita harus menggunakan code berikut untuk escape karakter spesial guna menghindarinya dianggap sebagai wildcard:

$keyword=$_GET['q'];
// escape % and _ characters
$keyword=strtr($keyword, array('%'=>'\%', '_'=>'\_'));
$command->where(array('like', 'title', '%'.$keyword.'%'));

order()

function order($columns)

Method order() menentukan bagian ORDER BY pada query. Parameter $columns menentukan kolom-kolom yang diurutkan. Dapat berupa sebuah string dengan kolom yang dipisahkan koma dan arah pengurutan (ASC atau DESC), atau sebuah array dari kolom dan arah pengurutan. Nama kolom dapat mengandung prefiks table. Method ini akan memberikan quote pada nama kolom secara otomatis kecuali kolom tersebut mengandung tanda kurung (yang berarti kolom tersebut merupakan ekspresi DB).
Berikut merupakan beberapa contohnya:

// ORDER BY `name`, `id` DESC
order('name, id desc')
// ORDER BY `tbl_profile`.`name`, `id` DESC
order(array('tbl_profile.name', 'id desc'))

limit() dan offset()

function limit($limit, $offset=null)
function offset($offset)

Method limit() dan offset() menentukan bagian OFFSET dan LIMIT pada query. Perhatikan bahwa beberapa DBMS mungkin tidak mendukung sintaks LIMIT dan OFFSET. Pada kasus tersebut, Query Builder akan menulis ulang seluruh statement SQL untuk mensimulasi fungsi limit dan offset.
Berikut merupakan beberapa contoh:

// LIMIT 10
limit(10)
// LIMIT 10 OFFSET 20
limit(10, 20)
// OFFSET 20
offset(20)

join() dan varian-variannya

function join($table, $conditions, $params=array())
function leftJoin($table, $conditions, $params=array())
function rightJoin($table, $conditions, $params=array())
function crossJoin($table)
function naturalJoin($table)

Method join() dan varian-variannya menentukan bagaimana melakukan join dengan table lain dengan menggunakan INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN, atau NATURAL JOIN. Parameter $table menentukan table mana yang akan dijoin. Nama table akan mengandung prefiks skema dan /atau alias. Method ini akan memberikan quote pada nama table kecuali kolom tersebut mengandung tanda kurung yang artinya bis berupa ekspresi DB atau sub-query. Parameter $conditions menentukan kondisi join. Sintaksnya sama dengan where(). Dan $params menentukan parameter yang diikat pada keseluruhan query.
Perhatikan bahwa tidak seperti method query builder lainnya, setiap pemanggilan method join akan ditambahkan di belakang sebelumnya.
Berikut merupakan beberapa contohnya.

// JOIN `tbl_profile` ON user_id=id
join('tbl_profile', 'user_id=id')
// LEFT JOIN `pub`.`tbl_profile` `p` ON p.user_id=id AND type=1
leftJoin('pub.tbl_profile p', 'p.user_id=id AND type=:type', array(':type'=>1))

group()

function group($columns)

Method group() menetapkan bagian GROUP BY pada query. Parameter $columns menentukan kolom-kolom yang dikelompokkan. Bisa berupa string yang berisi kolom dipisah koma, atau sebuah array dari kolom. Nama kolom bisa didapatkan pada prefiks table. Method ini akan secara otomatis memberikan quote pada nama kolom kecuali terdapat sebuah kolom yang mengandung tanda kurung (yang artinya kolom tersebut merupakan ekspresi DB).
Berikut beberapa contoh:

// GROUP BY `name`, `id`
group('name, id')
// GROUP BY `tbl_profile`.`name`, `id`
group(array('tbl_profile.name', 'id')

having()

function having($conditions, $params=array())

Method having() menetapkan bagian HAVING pada query. Penggunaannya sama dengan where().
Berikut contoh-contohnya:

// HAVING id=1 or id=2
having('id=1 or id=2')
// HAVING id=1 OR id=2
having(array('or', 'id=1', 'id=2'))

union()

function union($sql)

Method union() menentukan bagian UNION pada query. Method ini akan menambahkan $sql ke SQL yang sudah ada dengan menggunakan operator UNION. Memanggil union() beberapa kali akan menambahkan berkali-kali SQL-SQL-nya ke belakang SQL yang sudah ada.
Contoh:

// UNION (select * from tbl_profile)
union('select * from tbl_profile')

Menjalankan Query
Setelah melakukan pemanggilan method query builder di atas, kita dapat memanggil method DAO seperti yang dijelaskan pada Data Access Objects untuk mengeksekusi query. Misalnya, kita dapat memanggil CDbCommand::queryRow() untuk mendapatkan sebaris hasil atau CDbCommand::queryAll() untuk mendapatkan seluruhnya sekaligus. Berikut beberapa contohnya :

$users = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->queryAll();

Mengambil SQL-SQL
Selain menjalankan query yang dibuat oleh Query Builder, kita juga dapat menarik statement SQL bersangkutan. Untuk melakukannya gunakan fungsi CDbCommand::getText().

$sql = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->text;

Jika terdapat parameter tertentu yang terikat pada query, mereka dapat diambil melalui properti CDbCommand::params.
Sintaks Alternatif untuk Membentuk Query
Kadangkala, menggunakan method chaining bukanlah pilihan yang tepat. Query Builder Yii memungkinkan kita untuk membuat query dengan menggunakan assignment property object yang sederhana. Pada umumnya, untuk setiap method query builder, terdapat sebuah property yang memiliki nama yang sama. Meng-assign nilai ke property sama saja dengan memanggil method tersebut. Misalnya, berikut merupakan dua statement yang ekuivalen, dengan asumsi $command adalah objek CDbCommand:

$command->select(array('id', 'username'));
$command->select = array('id', 'username');

Selain itu, method CDbConnection::createCommand() dapat menerima array sebagai parameter. Pasangan nama-nilai di array akan digunakan untuk inisialisasi property instance CDbCommand yang dibuat. Ini artinya, kita dapat menggunakan code berikut untuk membuat sebuah query:

$row = Yii::app()->db->createCommand(array(
'select' => array('id', 'username'),
'from' => 'tbl_user',
'where' => 'id=:id',
'params' => array(':id'=>1),
))->queryRow();

Membangun Beberapa Query
Sebuah instance CDbCommand dapat dipakai ulang beberapa kali untuk membuat beberapa query. Namun, sebelum membuat query baru, harus memanggil method CDbCommand::reset() terlebih dahulu untuk menghapus query sebelumnya. Misalnya:

$command = Yii::app()->db->createCommand();
$users = $command->select('*')->from('tbl_users')->queryAll();
$command->reset(); // clean up the previous query
$posts = $command->select('*')->from('tbl_posts')->queryAll();

3. Membuat Query Manipulasi Data
Query manipulasi data adalah statement SQL untuk melakukan insert, update dan delete data dalam table database. Query builder menyediakan insert, update dan delete untuk tiap query tersebut. Tidak seperti method query SELECT yang dijelaskan di atas, setiap method query manipulasi data ini akan membuat sebuah statement SQL lengkap dan langsung menjalankannya.

* insert(): menyisipkan sebaris ke table
* update(): melakukan update data pada sebuah table
* delete(): menghapus data dari table

Di bawah ini kami akan memaparkan method-method query manipulasi data
insert()

function insert($table, $columns)

Method insert() membuat dan menjalankan statement SQL INSERT. Parameter $table menentukan table yang mana yang disisipkan, sedangkan $columns merupakan sebuah array dengan pasangan nama-nilai yang menjelaskan nilai-nilai kolom yang akan disisipkan. Method tersebut akan memberikan quote pada nama table dan akan menggunakan parameter-binding untuk nilai yang dimasukkan.
Berikut merupakan contohnya:

// buat dan jalankan SQL berikut :
// INSERT INTO `tbl_user` (`name`, `email`) VALUES (:name, :email)
$command->insert('tbl_user', array(
'name'=>'Tester',
'email'=>'tester@example.com',
));

update()

function update($table, $columns, $conditions='', $params=array())

Method update() akan membuat dan mengeksekusi statement UPDATE SQL. Parameter $table menentukan table mana yang akan di-update; $columns adalah sebuah array dengan pasangan nama-nilai yang menentukan nilai kolom yang akan di-update; $conditions dan $params mirip dengan where(), yang akan menetapkan klausa WHERE dalam statement UPDATE. Method ini akan memberikan quote pada nama dan menggunakan parameter-binding untuk nilai yang di-update.
Berikut merupakan contohnya:

// buat dan jalankan SQL berikut:
// UPDATE `tbl_user` SET `name`=:name WHERE id=:id
$command->update('tbl_user', array(
'name'=>'Tester',
), 'id=:id', array(':id'=>1));

delete()

function delete($table, $conditions='', $params=array())

Method delete() membuat dan menjalankan statement SQL DELETE. Parameter $table menentukan table yang mana yang akan dihapus; $conditions dan $params mirip dengan where(), yakni menentukan WHERE di dalam statement DELETE. Method ini akan memberikan quote pada nama.
Berikut salah satu contoh:

//buat dan eksekusi SQL berikut:
// DELETE FROM `tbl_user` WHERE id=:id
$command->delete('tbl_user', 'id=:id', array(':id'=>1));

4. Membuat Query Manipulasi Schema
Selain query manipulasi dan penarikan normal, query builder juga menyediakan sekumpulan method yang digunakan untuk membuat dan menjalankan query SQL untuk manipulasi schema pada database. Query builder mendukung query-query berikut:

* createTable(): membuat table
* renameTable(): mengubah nama table
* dropTable(): drop (menghapus) table
* truncateTable(): mengosongkan table
* addColumn(): menambahkan sebuah kolom table
* renameColumn(): mengubah nama kolom table
* alterColumn(): mengubah sebuah kolom table
* dropColumn(): me-drop (hapus) kolom table
* createIndex(): membuat index
* dropIndex(): me-drop (hapus) index

Info: Walaupun statement SQL yang digunakan untuk manipulasi database schema sangat berbeda di antara DBMS, query builder mencoba menyediakan sebuah interface yang seragam untuk membuat query-query ini. Ini akan memudahkan proses migrasi database dari satu DBMS ke yang lainnya.

Tipe Data Abstrak
Query builder memperkenalkan sekumpulan tipe data abstrak yang dapat digunakan untuk mendefinisikan kolom table. Tidak seperti tipe data physical yang spesifik pada DBMS tertentu dan cukup berbeda di DBMS lainnya, tipe data abstrak bebas dari DBMS. Ketika tipe data abstrak digunakan untuk mendefinisikan kolom table, query builder akan mengubahnya menjadi tipe data physical bersangkutan.
Berikut tipe data abstrak yang didukung oleh query builder.

* pk: sebuah jenis primary key generik, akan diubah menjadi int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY pada MySQL;
* string: jenis string, akan diubah menjadi varchar(255) pada MySQL;
* text: jenis teks (string panjang), akan diubah menjadi text pada MySQL
* integer: jenis integer, akan diubah menjadi int(11) pada MySQL;
* float: tipe angka floating, akan diubah menjadi float pada MySQL;
* decimal: tipe angka desimal, akan diubah menjadi decimal pada MySQL;
* datetime: tipe waktu tanggal, akan diubah menjadi datetime pada MySQL;
* timestamp: tipe timestamp, akan diubah menjadi timestamp pada MySQL;
* time: tipe waktu, akan diubah menjadi time pada MySQL;
* date: tipe tanggal, akan diubah menjadi date pada MySQL;
* binary: tipe data biner, akan diubah menjadi blob pada MySQL;
* boolean: tipe boolean, akan diubah menjadi tinyint(1) pada MySQL;
* money: tipe mata uang, akan diubah menjadi decimal(19,4) pada MySQL. Tipe ini sudah ada semenjak versi 1.1.8.

createTable()

function createTable($table, $columns, $options=null)

Method createTable() akan membuat dan menjalankan statement SQL untuk menghasilkan sebuah table. Parameter $table akan menentukan nama dari table yang dibuat. Parameter $columns menentukan kolom-kolom pada table baru. Kolom-kolom ini harus diberikan dalam bentuk pasangan nama-definisi (misalnya 'username'=>'string'). Parameter $options menentukan pecahan SQL ekstra yang harus ditambahkan pada SQL yang dihasilkan. Query builder akan memberikan quote pada nama table dan nama kolom.
Ketika menentukan definisi sebuah kolom, kita dapat menggunakan tipe data abstrak seperti yang sudah dijelaskan di atas. Query builder akan mengubah tipe data abstrak tersebut menjadi tipe data physical bersangkuta, sesuai dengan DBMS yang digunakan. Misalnya, string akan diubah menjadi varchar(255) pada MySQL.
Sebuah definisi kolom juga bisa mengandung tipe data non-abstrak atau spesifikasi. Definisi kolom ini akan dmasukkan juga ke dalam SQL tanpa perubahan. Misalnya point bukanlah tipe data abstrak, dan jika digunakan di definisi kolom, maka akan keluar demikian pada SQL; dan string NOT NULL akan diubah menjadi varchar(255) NOT NULL (hanya tipe abstrak string yang diubah).
Berikut contoh bagaimana membuat sebuah table:

// CREATE TABLE `tbl_user` (
// `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
// `username` varchar(255) NOT NULL,
// `location` point
// ) ENGINE=InnoDB
createTable('tbl_user', array(
'id' => 'pk',
'username' => 'string NOT NULL',
'location' => 'point',
), 'ENGINE=InnoDB')

renameTable()

function renameTable($table, $newName)

Method renameTable() membuat dan menjalankan statement SQL untuk mengubah nama table. Parameter $table menentukan nama dari table yang akan di-rename. Parameter $newName menentukan nama baru dari table. Query builder akan memberikan quote pada nama table.
Berikut contoh bagaimana melakukan perubahan nama pada table :

// RENAME TABLE `tbl_users` TO `tbl_user`
renameTable('tbl_users', 'tbl_user')

dropTable()

function dropTable($table)

Method dropTable() membuat dan menjalankan statement SQL untuk menghapus sebuah table. Parameter $table menentukan nama table yang akan di-drop (hapus). Query builder akan memberikan quote pada nama table.
Berikut contoh bagaimana menghapus sebuah table:

// DROP TABLE `tbl_user`
dropTable('tbl_user')

truncateTable

function truncateTable($table)

Method truncateTable() membuat dan menjalankan statement SQL untuk menghapus sebuah table. Parameter $table menentukan nama table yang ingin dikosongkan. Query builder akan memberikan quote pada nama table.
Berikut contoh bagaimana mengosongkan table:

// TRUNCATE TABLE `tbl_user`
truncateTable('tbl_user')

addColumn()

function addColumn($table, $column, $type)

Method addColumn() membuat dan menjalankan statement SQL untuk menambah kolom table baru. Parameter $table menentukan nama dari table yang akan ditambahkan kolom baru. Parameter $column akan menentukan nama dari kolom baru. Dan $type menentukan definisi kolom baru. Definisi kolom dapat mengandung tipe data abstrak, seperti yang dijelaskan pada sub-bagian "createTable" sebelumnya. Query builder akan memberikan quote pada nama table termasuk nama kolom.
Berikut contoh menambah sebuah kolom table:

// ALTER TABLE `tbl_user` ADD `email` varchar(255) NOT NULL
addColumn('tbl_user', 'email', 'string NOT NULL')

dropColumn()

function dropColumn($table, $column)

Method dropColumn() membuat dan menjalankan statement SQL untuk menghapus kolom table. Parameter $table menentukan nama dari table yang kolomnnya akan dihapus. Parameter $column menentukan nama dari kolom yang akan dihapus. Query builder akan memberikan quote pada nama table termasuk nama kolom.
Berikut contoh bagaimana menghapus sebuah kolom table:

// ALTER TABLE `tbl_user` DROP COLUMN `location`
dropColumn('tbl_user', 'location')

renameColumn()

function renameColumn($table, $name, $newName)

Method renameColumn() membuat dan mengeksekusi statement SQL untuk mengubah nama kolom table. Parameter $table menentukan nama table yang nama kolomnya akan diubah. Parameter $name menentukan nama kolom yang lama. Dan $newName menentukan nama kolom baru. Query builder akan memberikan quote pada nama table termasuk pada nama kolom.
Berikut contoh mengubah nama kolom table:

// ALTER TABLE `tbl_users` CHANGE `name` `username` varchar(255) NOT NULL
renameColumn('tbl_user', 'name', 'username')

alterColumn()

function alterColumn($table, $column, $type)

Method alterColumn() membuat dan menjalankan statement SQL untuk mengubah kolom table. Parameter $table menentukan nama table yang kolomnya akan diubah. Parameter $column menentukan nama kolom yang akan diubah. Dan $type menentukan definisi baru pada kolom. Definisi kolom dapat mengandung tipe data abstrak, seperti yang sudah dijelaskan pada sub-bagian "createTable". Query builder akan memberikan quote pada nama table dan nama kolom.
Berikut contoh mengubah kolom table:

// ALTER TABLE `tbl_user` CHANGE `username` `username` varchar(255) NOT NULL
alterColumn('tbl_user', 'username', 'string NOT NULL')

addForeignKey()

function addForeignKey($name, $table, $columns,
$refTable, $refColumns, $delete=null, $update=null)

Method addForeignKey() akan membuat dan menjalankan statement SQL untuk menambahkan foreign key constraint pada sebuah table. Parameter $name menentukan nama foreign key. Parameter $table dan $columns menentukan nama table dan nama kolom yang akan ditetapkan sebagai foreign key. JIka lebih dari satu kolom, maka bisa dipisahkan dengan menggunakan koma. Parameter $refTable dan $refColumns menentukan nama dan kolom table yang akan menjadi reference foreign key. Parameter $delete dan $update menentukan opsi ON DELETE dan ON UPDATE dalam statement SQL. Kebanyakan DBMS mendukung opsi ini:RESTRICT, CASCADE, NO ACTION, SET DEFAULT, SET NULL. Query builder akan memberikan quote pada nama table, nama index dan nama kolom.
Berikut contoh menambah foreign key constraint,

// ALTER TABLE `tbl_profile` ADD CONSTRAINT `fk_profile_user_id`
// FOREIGN KEY (`user_id`) REFERENCES `tbl_user` (`id`)
// ON DELETE CASCADE ON UPDATE CASCADE
addForeignKey('fk_profile_user_id', 'tbl_profile', 'user_id',
'tbl_user', 'id', 'CASCADE', 'CASCADE')

dropForeignKey()

function dropForeignKey($name, $table)

Method dropForeignKey() membuat dan menjalankan statement SQL untuk menghapus sebuah foreign key constraint. Parameter $name menentukan nama dari foreign key constraint yang akan dihapus. Parameter $table menentukan nama table yang foreign key constraintnya akan dihapus. Query builder akan memberikan quote pada nama table dan juga nama constraint.
Berikut contoh menghapus foreign key constraint:

// ALTER TABLE `tbl_profile` DROP FOREIGN KEY `fk_profile_user_id`
dropForeignKey('fk_profile_user_id', 'tbl_profile')

createIndex()

function createIndex($name, $table, $column, $unique=false)

Method createIndex() membuat dan menjalankan statement SQL untuk membuat sebuah index. Parameter $name menentukan nama index yang akan dibuat. Parameter $table menentukan nama table yang index-nya berada. Parameter $column menentukan nama kolom yang akan di-indeks. Dan parameter $unique menentukan apakah harus membuat unique index. Jika index terdiri dari beberapa kolom, maka harus dipisah dengan koma. Query builder akan memberikan quote pada nama table, nama index dan nama kolom.
Berikut contoh pembuatan index:

// CREATE INDEX `idx_username` ON `tbl_user` (`username`)
createIndex('idx_username', 'tbl_user')

dropIndex()

function dropIndex($name, $table)

Method dropIndex() membuat dan mengeksekusi statement SQL untuk menghapus indeks. Parameter $name menentukan nama dari yang index-nya akan dihapus. Parameter $table menentukan nama table yang index-nya akan dihapus. Query builder akan memberikan quote pada nama table sekaligus nama index.
Below is an example showing how to drop an index:

// DROP INDEX `idx_username` ON `tbl_user`
dropIndex('idx_username', 'tbl_user')

Factory Method

Nim :1108100268


Factorymethod

Static Factory Method dan Contoh Penggunaannya
Kita sebagai programmer Java sering sekali langsung menggunakan operator new untuk melakukan konstruksi dan inisialisasi class kita menjadi object. Kita bisa menggunakan cara lain, yaitu dengan factory method.


Apa sebenarnya fungsi operator new ?


Dengan bahasa yang sangat teknis maka fungsi operator new adalah melakukan konstruksi dan inisialisasi class kita dengan melakukan alokasi memori untuk objek baru dan mengembalikan referensi memori dari objek tersebut. Operator ini juga akan menjalankan metode constructor.


Constructor sendiri adalah method yang namanya sama dengan nama class yang kita definisikan. Contoh penggunaan constructor dan operator new adalah seperti pada listing kedua class Java di bawah ini.


RowData.java
view plaincopy to clipboardprint?

1. import java.text.SimpleDateFormat;
2. import java.util.Date;
3.
4.
5. public class RowData {
6. private int numberOfFields;
7. private Date currentDate;
8.
9. public RowData() {
10. this.numberOfFields = 0;
11.
12. currentDate = new Date();
13. }
14.
15. public void printCurrentDate()
16. {
17. SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
18. System.out.println(df.format(currentDate));
19. }
20.
21. }



InstantiateRowData .java
view plaincopy to clipboardprint?

1. public class InstantiateRowData {
2.
3. public static void main(String[] args)
4. {
5. /*
6. **********************************
7. * Konstruksi objek
8. * dengan memanggil operator new
9. * secara langsung dari luar class
10. **********************************
11. */
12. RowData c = new RowData();
13.
14. c.printCurrentDate();
15. }
16. }



Factory Method

Factory method adalah method yang memiliki fungsi khusus untuk melakukan konstruksi class menjadi objek dan mengembalikan referensi objek tersebut.

Method ini harus bersifat static dan ditempelkan ke dalam class tersebut. Dan untuk menjamin bahwa kita tidak akan bisa melakukan konstruksi langsung maka secara eksplisit method constructor harus diubah diberi akses private.

Lihatlah kedua class setelah diubah konstruksinya.

RowData.java
view plaincopy to clipboardprint?

1. import java.text.SimpleDateFormat;
2. import java.util.Date;
3.
4.
5. public class RowData {
6. private int numberOfFields;
7. private Date currentDate;
8.
9. private RowData() {
10. this.numberOfFields = 0;
11.
12. currentDate = new Date();
13. }
14.
15. public static RowData getRowData()
16. {
17. return new RowData();
18. }
19.
20. public void printCurrentDate()
21. {
22. SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
23. System.out.println(df.format(currentDate));
24. }
25.
26. }


Perhatikan di baris 9 bahwa constructor kita telah diberi akses private dari yang sebelumnya bersifat publicsehingga operator new tidak mungkin dapat mencapainya lagi dari luar class RowData. Kita menggantikannya dengan suatu method static getRowData() yang bersifat public. Di dalam method ini kita kembali melakukan konstruksi objek dengan operator new.


InstantiateRowData.java
view plaincopy to clipboardprint?

1. public class InstantiateRowData {
2.
3. public static void main(String[] args)
4. {
5. /*
6. **********************************
7. * Konstruksi objek
8. * dengan memanggil
9. * factory method
10. **********************************
11. */
12. RowData c = RowData.getRowData();
13.
14. c.printCurrentDate();
15. }
16. }

Kegunaan Factory Method


Walaupun kelihatan sangat sederhana, tetapi apabila kita sudah makin mahir dalam melakukan coding di Java dan menangani proyek yang makin lama skalanya semakin besar maka akan ada kebutuhan untuk membuat aplikasi yang bersifat concurrent atau yang bersifat parallel multi threading. Kondisi ini membuat kita membutuhkan teknik coding yang makin kompleks dan sophisticated. Salah satunya adalah menghindarkan konstruksi objek setengah jadi (half-constructed object) yang dapat terekspos melalui methodconstructor. Dan ini bisa dipecahkan dengan sangat baik melalui teknik factory method ini.


Selain itu factory method ini juga sudah menjadi bagian dari design pattern yang merupakan kumpulan pola coding yang bisa digunakan kembali sesuai kasus atau reusable

Abstract Factory Pattern (AFP)

Nim :1108100268

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 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.
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 ConcreteFactory. Lihat hasil pemetaan Factory Matrix ToysFactory ke UML class diagram.


berikut contoh penerapannya di php.
view sourceprint?
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 ?>

Singleton_pattern

Nim :1108100268


Pattern ini merupakan pattern yang paling sederhana di antara pattern-pattern yang lain. Hanya membutuhkan satu kelas pada class diagram. Ok, langsung saja. Ini definisi dari Singleton Pattern:
Singleton Pattern memastikan suatu kelas hanya terdapat satu instance dan kelas tersebut menyediakan akses ke instance itu.
Hah? Hanya satu instance? Satu objek? Kita capek-capek membuat kelas, hanya bisa di-instance sekali?
Yap. Ada banyak situasi dimana kita hanya membutuhkan satu objek. Misalnya, objek yang berfungsi sebagai driver dari suatu device seperti printer. Apa jadinya bila lebih dari satu? Pernah lihat pesan yang menampilkan drivers conflict. Yeah, sort of it.
Faktanya, banyak lagi tipe objek yang jika di-instance-kan lebih dari satu menyebabkan terjadinya masalah seperti penggunaan resource yang tidak normal, behavior program yang tidak benar, dan hasil yang tidak konsisten.
Sekarang, kita lihat saja kelas Singleton berikut:
01

public class Singleton {
02 private static Singleton myInstance;
03
04
// atribut yang lain
05
06 private Singleton() {
07
08
}
09
10 public static Singleton getInstance() {
11 if (myInstance == null) {
12 myInstance = new Singleton();
13
}
14 return myInstance;
15 }
16
17 // method yang lain
18 }

Sekarang, pertanyaannya, apa artinya kode di atas? Kenapa kode tersebut bisa memunculkan efek Singleton?
Kita coba uraikan kode di atas. Dimulai dengan constructor berikut:
1

private Singleton() {
2


3

}
Hmmm…private constructor? Di Java, kita buat objek baru minimal dengan menuliskan statement new SomeObject(). Nah, tanda kurung di belakang SomeObject menyatakan: sebelum membuat objek baru, kita panggil constructor-nya.
Tapi…, bagaimana kalau kelas kita tidak punya constructor? See, I don’t have a constructor, so I don’t need to invoke constructor. Meskipun kelas kita tidak mempunyai constructor, JVM menambahkan default-nya untuk kita:
1 public SomeObject() {
2
3 }
Jadi, kelas kita pasti ada constructor-nya, biarpun kita tidak menuliskannya secara eksplisit.
Sekarang, apa artinya modifier private pada constructor? Yap, memang tidak seperti constructor kebanyakan yang menggunakan public. Private di sini berarti hanya kode yang sekelas dengan constructor yang dapat mengakses constructor ini. Tidak ada yang bisa mengaksesnya di luar kelas. Dengan kata lain, tidak ada yang bisa mengeksekusi statement “new” di luar kelas, karena kita tidak bisa mengakses constructor-nya.
Jadi, kelas Singleton di atas tidak bisa di-instance-kan?
Nope, bisa, asal di-instance-kan di dalam kelas Singleton.
Sekarang, kita telusuri lagi kelas Singleton, dan menemukan snippet kode seperti ini:
1 public static Singleton getInstance() {
2 if (myInstance == null) {
3 myInstance = new Singleton();
4 }
5 return myInstance;
6 }
Method getInstance() di atas bertipe static. Dengan bertipe static menjadikan method tersebut hanya terdapat satu saja di antara instance-instance. Karena static method hidup di kelas, dan bukan di instance-instance. Berbeda dengan constructor yang private, method ini bersifat public sehingga bisa dipanggil di luar kelas Singleton. Dan karena bertipe static, method tersebut kita panggil dengan mengkualifikasikan nama kelas dan nama method seperti ini:
1
Singleton.getInstance()
Method getInstance()
menyediakan cara bagi kita untuk meng-instance-kan kelas Singleton dan mengembalikan instance tersebut.
Jika myInstance null, artinya kita belum membuat instance. Kemudian, kita meng-instance-kan Singleton melalui private constructor-nya dan meng-assign instance ini ke myInstance. Ini bisa dilakukan karena kita meng-instance-kan di dalam kelas Singleton. Atribut myInstance ini bertipe static juga, karena instance kita merupakan satu-satunya instance kelas Singleton.
Jika myInstance tidak null, artinya kita sudah mempunyai instance, dan instance tersebut yang akan dikembalikan ke kita.
Jadi, kita masih bisa membuat instance dari kelas Singleton. Tapi, hanya satu. Tidak lebih! Karena itulah yang kita harapkan dari Singleton pattern ini.