5.1. Flyweight Pattern
Flyweight Pattern adalah sebuah
perangkat lunak desain pattern. Flyweight
pattern adalah sebuah objek yang meminimalkan penggunaan memori dengan berbagi
data sebanyak mungkin dengan objek sejenis, yang merupakan cara untuk
menggunakan benda-benda dalam jumlah besar ketika representasi diulang
sederhana akan menggunakan jumlah yang dapat diterima dari memori. Seringkali
beberapa bagian dari negara objek dapat dibagi, dan itu adalah praktek umum
untuk menahan mereka dalam struktur data eksternal dan meneruskannya ke objek
kelas flyweight sementara ketika mereka digunakan.
Sebuah contoh klasik dari
penggunaan pola flyweight adalah struktur data untuk representasi grafis dari
karakter dalam pengolah kata. Mungkin diinginkan untuk memiliki, untuk setiap
karakter dalam dokumen, sebuah flyweight objek yang mengandung outline font,
metrik font, dan data format lain, tapi ini akan berjumlah ratusan atau ribuan
byte untuk setiap karakter. Sebaliknya, untuk setiap karakter mungkin ada
referensi ke objek mesin flyweight kelas flyweight bersama oleh setiap contoh
karakter yang sama dalam dokumen, hanya posisi masing-masing karakter (dalam
dokumen dan / atau halaman) akan perlu disimpan secara internal.
Maksud dari pola ini adalah dengan menggunakan berbagi untuk
mendukung sejumlah besar objek yang memiliki bagian dari keadaan internal mereka
yang sama di mana bagian lain dapat bervariasi.
Diagram UML untuk Pola Flyweight:
![*](file:///C:/Users/INDRAK%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)
![*](file:///C:/Users/INDRAK%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)
![*](file:///C:/Users/INDRAK%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)
Pada contoh perang pabrik Soldier kelas terbang dapat membuat dua jenis flyweights: sebuah kelas terbang Prajurit, serta kelas terbang Kolonel. Ketika Klien meminta Pabrik untuk seorang prajurit, pabrik memeriksa apakah ada tentara di kolam renang, jika ada, itu dikembalikan ke klien, jika tidak ada tentara di kolam renang, seorang tentara dibuat, ditambahkan ke kolam, dan kembali ke klien, pada saat klien meminta untuk seorang prajurit, prajurit dibuat sebelumnya dikembalikan, tidak ada prajurit baru dibuat.
![*](file:///C:/Users/INDRAK%7E1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)
Pola kelas
terbang berlaku untuk program menggunakan sejumlah besar objek yang memiliki
bagian dari keadaan internal mereka yang sama di mana bagian lain negara dapat
bervariasi. Pola ini digunakan ketika bagian besar negara objek dapat dibuat
ekstrinsik (eksternal untuk obyek itu).
Contoh code pola
flyweight dalam java:
import java.awt.*;
import java.util.Vector;
class ColorBox2 extends Canvas {
private
Color curColor = getColor();
private
static
Color[] colors = { Color.black, Color.blue, Color.cyan,
Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.red,
Color.magenta, Color.orange, Color.pink, Color.white, Color.yellow };
public
ColorBox2( ThreadPool2 tp ) {
tp.register(
this);
}
private
static
Color getColor() {
return
colors[ (
int)(Math.random() *
1000) % colors.length ];
}
public
void
changeColor() {
curColor = getColor();
repaint();
}
public
void
paint( Graphics g ) {
g.setColor( curColor );
g.fillRect(
0,
0, getWidth(), getHeight() );
} }
class ThreadPool2 {
private
final
int
NUM_THREADS =
8;
private
Vector cboxes =
newVector();
private
int
pause;
class HandlerThread extends Thread {
public
void
run() {
while
(
true) {
((ColorBox2) cboxes.elementAt(
(
int)(Math.random()*
1000) % cboxes.size() )).changeColor();
try
{ Thread.sleep( pause ); }
catch( InterruptedException e ) { }
} } }
public
ThreadPool2(
intp ) {
pause = p;
}
public
void
register( ColorBox2 r ) {
cboxes.addElement( r );
}
public
void
start() {
for
(
inti=
0; i < NUM_THREADS; i++)
newHandlerThread().start();
} }
publicclass ColorBoxes2 {
public
static
void
main( String[] args ) {
int
size =
8, pause =
10;
if
(args.length >
0) size = Integer.parseInt( args[
0] );
if
(args.length >
1) pause = Integer.parseInt( args[
1] );
ThreadPool2 tp =
newThreadPool2( pause );
Frame f =
newFrameClose(
"ColorBoxes2 - 8 shared HandlerThreads");
f.setLayout(
newGridLayout( size, size ) );
for
(
inti=
0; i < size*size; i++)
f.add(
newColorBox2( tp ) );
f.setSize(
500,
400);
f.setVisible(
true);
tp.start();
} }
Hasil :
5.2. Proxy Patterns
Kadang kita
memerlukan kemampuan untuk mengontrol akses ke suatu objek. Sebagai contoh jika
kita perlu menggunakan hanya beberapa metode dari beberapa objek mahal kita
akan menginisialisasi objek tersebut ketika kita membutuhkan mereka sama
sekali. Sampai saat itu kita dapat menggunakan beberapa benda ringan mengekspos
antarmuka yang sama dengan benda berat. Obyek-obyek cahaya disebut proxy dan
mereka akan instantiate objek-objek berat ketika mereka benar-benar membutuhkan
dan pada saat itu kita akan menggunakan beberapa objek cahaya, bukan. Kemampuan
untuk mengontrol akses ke suatu objek dapat diperlukan untuk berbagai alasan:
mengendalikan jika benda mahal perlu instantiated dan diinisialisasi,
memberikan hak akses yang berbeda untuk objek, serta menyediakan sarana canggih
mengakses dan referensi objek berjalan di proses lainnya, pada mesin lain.
Maksud dari pola ini adalah untuk menyediakan "Placeholder" untuk
sebuah objek untuk mengontrol referensi untuk itu.
Diagram
UML untuk Pola Flyweight:
Kelas peserta dalam pola proxy:
Ø
Subjek - Antarmuka dilaksanakan oleh RealSubject dan mewakili
layanannya. Antarmuka harus dilaksanakan oleh proxy juga sehingga proxy dapat
digunakan di setiap lokasi di mana RealSubject dapat digunakan.
Ø
Proxy
§ Menjaga referensi yang memungkinkan proxy untuk mengakses
RealSubject tersebut.
§ Mengimplementasikan antarmuka yang sama dilaksanakan oleh
RealSubject sehingga proxy dapat diganti untuk RealSubject tersebut.
§ Kontrol akses ke RealSubject dan mungkin bertanggung jawab
untuk penciptaan dan penghapusan.
§ Tanggung jawab lain tergantung pada jenis proxy.
Ø
RealSubject - objek nyata yang merupakan proxy.
Pola desain Proxy berlaku jika ada kebutuhan untuk
mengontrol akses ke sebuah Object, serta ketika ada kebutuhan untuk referensi
canggih untuk sebuah Object. Situasi umum di mana pola proxy yang berlaku
adalah:
- Proxy Virtual menunda penciptaan dan inisialisasi obyek mahal sampai dibutuhkan, di mana objek diciptakan pada permintaan (Misalnya menciptakan objek RealSubject hanya ketika metode doSomething dipanggil).
- Proxy remote: menyediakan representasi lokal untuk sebuah benda yang berada dalam ruang alamat yang berbeda. Sebuah contoh umum adalah Java RMI objek tulisan rintisan. Tujuan tulisan rintisan bertindak sebagai proxy mana invoking metode pada stub akan menyebabkan stub untuk berkomunikasi dan memanggil metode pada remote object (disebut skeleton) menemukan pada mesin yang berbeda.
- Proxy Perlindungan: dimana proxy mengontrol akses ke metode RealSubject, dengan memberikan akses ke beberapa objek sementara menolak akses kepada orang lain.
- Referensi Smart: menyediakan akses yang canggih untuk benda-benda tertentu seperti pelacakan jumlah referensi ke sebuah obyek dan menolak akses jika sejumlah tertentu tercapai, serta memuat objek dari database ke dalam memori pada permintaan.
Contoh code pola proxy dalam Java:
importjava.io.*;
importjava.net.*;
// 5. To support plug-compatibility between
// the wrapper and the target, create an interface
interface SocketInterface {
String readLine();
void
writeLine( String str );
void
dispose();
}
publicclass ProxyDemo {
public
static
void
main( String[] args ) {
// 3. The client deals with the wrapper
SocketInterface socket =
newSocketProxy(
"127.0.0.1",
8189,
args[
0].equals(
"first") ?
true:
false);
String str =
null;
boolean
skip =
true;
while
(
true) {
if
(args[
0].equals(
"second") && skip) {
skip = ! skip;
}
else
{
str = socket.readLine();
System.out.println(
"Receive - "+ str );
// java ProxyDemo first
if
(str.equals(
"quit"))
break;
// Receive - 123 456
}
// Send ---- 234 567
System.out.print(
"Send ---- ");
// Receive - 345 678
str = Read.aString();
//
socket.writeLine( str );
// java ProxyDemo second
if
(str.equals(
"quit"))
break;
// Send ---- 123 456
}
// Receive - 234 567
socket.dispose();
// Send ---- 345 678
}
}
class SocketProxy implements SocketInterface {
// 1. Create a "wrapper" for a remote,
// or expensive, or sensitive target
private
Socket socket;
private
BufferedReader in;
private
PrintWriter out;
public
SocketProxy( String host,
intport,
booleanwait ) {
try
{
if
(wait) {
// 2. Encapsulate the complexity/overhead of the target in the wrapper
ServerSocket server =
newServerSocket( port );
socket = server.accept();
}
else
socket =
newSocket( host, port );
in =
newBufferedReader(
newInputStreamReader(
socket.getInputStream()));
out =
newPrintWriter( socket.getOutputStream(),
true);
}
catch( IOException e ) {
e.printStackTrace();
}
}
public
String readLine() {
String str =
null;
try
{
str = in.readLine();
}
catch( IOException e ) {
e.printStackTrace();
}
return
str;
}
public
void
writeLine( String str ) {
// 4. The wrapper delegates to the target
out.println( str );
}
public
void
dispose() {
try
{
socket.close();
}
catch( IOException e ) {
e.printStackTrace();
}
}
}
Tidak ada komentar:
Posting Komentar