Wednesday 10 April 2013

Pattern Flyweight di Java, C# dan PHP

Pagi hari yang mendung :) tapi alhamdulillah masi sehat... masi tentang design pattern yang ane bahas, kali ini pattern Flyweight  yang kudu di action dan contoh nya di Java, C# dan PHP... kelas terbang... arti dari pattern ini... dan fungsinya seperti pattern lainnya, yaitu untuk penghematan memory... pattern ini hampir sama konsep kerjanya dengan factory method yaitu penggunaan object yang mirip dan juga memanfaatkan konsep singleton untuk penghematan memory... hanya saja pattern flyweight ini memnafaatkan list dlam mengakses factory object nya...
hemmb... ya.. kurang lebih begitulah konsepnya flyweight ini, pada contoh penerapannya ane akan melakukan sebuah operasi yang menggunakan konsep singleton dan factory yang object singleton akan mengakses operasi method yang berbeda. biar lebih jelas dan gak bingung langsung aje ke penerapan / implementasi nya di Java, C# dan PHP...


package FlyWeight;

import java.util.HashMap;
import java.util.Map;

public class MainClass {
 public static void main(String[] args) {
  FlyWeightFactory factory = FlyWeightFactory.GetInstance();
  
  for(byte i = 0; i<5; i++){
   FlyWeight penjumlahan = factory.GetFlyWeight("penjumlahan");
   penjumlahan.DoIt(i, i);
   
   FlyWeight perkalian = factory.GetFlyWeight("perkalian");
   perkalian.DoIt(i, i);
  }
 }
}

interface FlyWeight{
 public void DoIt(int a,int b);
}

class Penjumlahan implements FlyWeight{
 public Penjumlahan() {
  try{
   operasi = "Penjumlahan";
  }catch (Exception e) {
   e.printStackTrace();
  }
 }
 private String operasi;
 @Override
 public void DoIt(int a,int b) {
  System.out.println(operasi+" dari "+a+" dan "+b+" adalah "+(a+b));
 }
}

class Perkalian implements FlyWeight{
 public Perkalian() {
  try{
   operasi = "Perkalian";
  }catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 private String operasi;
 
 @Override
 public void DoIt(int a, int b) {
  System.out.println(operasi+" dari "+a+" dan "+b+" adalah "+(a*b));
 }
}

class FlyWeightFactory{
 private static FlyWeightFactory flyWeightFactory = null;
 private Map<String, FlyWeight> flyWeightpool = null;
 public FlyWeightFactory() {
  flyWeightpool = new HashMap<String, FlyWeight>();
 }
 public static FlyWeightFactory GetInstance(){
  if(flyWeightFactory == null){
   flyWeightFactory = new FlyWeightFactory();
  }
  return flyWeightFactory;
 }
 
 public FlyWeight GetFlyWeight(String key){
  if(flyWeightpool.containsKey(key)){
   return flyWeightpool.get(key);
  }else{
   FlyWeight flyWeight;
   if(key.equals("penjumlahan")){
    flyWeight = new Penjumlahan();
   }else{
    flyWeight = new Perkalian();
   }
   flyWeightpool.put(key, flyWeight);
   return flyWeight;
  }
 }
}


C#
using System;
using System.Threading;
using System.Collections;

namespace FlyWeight_1
{
 class Program
 {
  public static void Main(string[] args)
  {
   FlyweightFactory factory = new FlyweightFactory();
   for(byte i = 0; i<5; i++)
   {
    Flyweight penjumlahan = factory.GetFlyweight("penjumlahan");
    penjumlahan.Operation(i,i);
    
    Flyweight perkalian = factory.GetFlyweight("perkalian");
    perkalian.Operation(i,i);
   }
   
   Console.ReadKey(true);
  }
 }
 
 class FlyweightFactory
 {
  private Hashtable flyweights = new Hashtable();
  
     public FlyweightFactory()
     {
       flyweights.Add("penjumlahan", new Penjumlahan());
       flyweights.Add("perkalian", new Perkalian());
     }
  
     public Flyweight GetFlyweight(string key)
     {
       return ((Flyweight)flyweights[key]);
     }
  }
 
 abstract class Flyweight
 {
     public abstract void Operation(int a,int b);
 }
 
 class Penjumlahan : Flyweight
 {
  public Penjumlahan()
  {
   try
   {
    operasi = "Penjumlahan";
   }
   catch(Exception e){
    Console.WriteLine(e.Message);
   }
  }
  
  private string operasi;
  
  public override void Operation(int a,int b)
     {
   Console.WriteLine(operasi+" dari "+a+" dan "+b+" adalah "+(a+b));
     }
 }
 
 class Perkalian : Flyweight
 {
  public Perkalian()
  {
   try
   {
    operasi = "Perkalian";
   }
   catch(Exception e){
    Console.WriteLine(e.Message);
   }
  }
  
  private string operasi;
  
   public override void Operation(int a,int b)
     {
      Console.WriteLine(operasi+" dari "+a+" dan "+b+" adalah "+(a*b));
     }
 }
}


PHP
<?php
 interface FlyWeight{
  function Operasi($a,$b);
 }
 
 class Penjumlahan implements FlyWeight{
  function __construct(){
   $this->operasi = "Penjumlahan";
  }
  private $operasi;
  
  function Operasi($a,$b){
   echo $this->operasi." dari ".$a." dan ".$b." adalah ".($a+$b)."< br />";
  }
 }
 
 class Perkalian implements FlyWeight{
  function __construct(){
   $this->operasi = "Perkalian";
  }
  private $operasi;
  
  function Operasi($a,$b){
   echo $this->operasi." dari ".$a." dan ".$b." adalah ".($a*$b)."< br />";
  }
 }
 
 class FlyWeightFactory{
  private $factory = array();
  function __construct(){
   $this->factory['penjumlahan'] = new Penjumlahan();
   $this->factory['perkalian'] = new Perkalian();
  }
  
  function GetFlyweight($key){
   return $this->factory[$key];
  }
 }
 
 $flyWeightFactory = new FlyWeightFactory();
 
 for($i = 0; $i<5; $i++){
  $penjumlahan = $flyWeightFactory->GetFlyweight("penjumlahan");
  $penjumlahan->Operasi($i,$i);
  
  $perkalian = $flyWeightFactory->GetFlyweight("perkalian");
  $perkalian->Operasi($i,$i);
 }
?>
cukup mudah untuk menerapkan design pattern flyweight ini di Java, C# dan PHP... kalo ente belum paham, monggo tanya ke ane lewat facebook aje biar cepet :D.. cukup dulu untuk postingan ini, semoga bermanfaat...

No comments:

Post a Comment