Flyweight 패턴

Flyweight 패턴

Flyweight 패턴은 비용이 큰 자원을 공통으로 사용할 때, 그 비용을 최소화 하기위해 사용하는 패턴입니다.

자원에 대한 비용이 클 때라 함은, 객체의 생성 빈도가 높을 경우(중복 생성) 또는 객체의 생성 비용이 클 경우 입니다.

즉, Flyweight 패턴은 인스턴스를 공유를 최대한 하며, 객체의 중복생성을 방지하는 것.

간단한 예제

Flyweight 패턴으로 간단한 예제를 작성해 봅니다.
예제의 다이어그램은 아래와 같습니다.

설명

  • Toy : 장난감의 정보(제조 방법 등등..)을 정의
  • Car, Train, Cook : 자동차, 기차, 요리 장난감의 제조정보 등등의 각각의 기능정의
  • ToyShop : Flyweight패턴에서 인스턴스의 공유를 담당하는 역할을 하는 클래스

Toy

package pattern.flyweight.ex;

public interface Toy {
 String getName();
 String getRecipe();
}

Car

package pattern.flyweight.ex;

public class Car implements Toy{

 public Car() {
 }

 @Override
 public String getName() {
   return "Car";
 }

 @Override
 public String getRecipe() {
   return "Make wheels and frame";
 }
}

Cook

package pattern.flyweight.ex;

public class Cook implements Toy{

 public Cook() {
 }

 @Override
 public String getName() {
   return "Cook";
 }

 @Override
 public String getRecipe() {
   return "Make frame and size is 1 meter";
 }
}

Train


package pattern.flyweight.ex;

public class Train implements Toy{

 public Train() {
 }

 @Override
 public String getName() {
   return "Train" ;
 }

 @Override
 public String getRecipe() {
   return "Make train and rails";
 }
}

ToyShop

package pattern.flyweight.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Function;

public class ToyShop {

 private static Map<String, Toy> toyList = new HashMap<>();

 public ToyShop() {

 }

 public Toy getToyRecipe(String toyName){

   Toy toy = toyList.get(toyName);
   if(toy == null){
     if(toyName.equals("Car")){
       toy = new Car();
     }else if(toyName.equals("Cook")){
       toy = new Cook();
     }else if(toyName.equals("Train")){
       toy = new Train();
     }
     toyList.put(toyName, toy);
   }

   return toy;
 }

 public void getToys(){

   for(Entry<String, Toy> toy : toyList.entrySet()){
     System.out.println("Name: " + toy.getValue().getName());
     System.out.println("Recipe: " + toy.getValue().getRecipe());
   }
 }
}

App 실행


public class App {

  public static void main(String[] args) {

    ToyShop toyShop = new ToyShop();
    System.out.println("===============Toy Add==========");
    System.out.println(toyShop.getToyRecipe("Car").getRecipe());
    toyShop.getToys();


    System.out.println("===============Toy Add==========");
    System.out.println(toyShop.getToyRecipe("Cook").getRecipe());
    toyShop.getToys();

    System.out.println("===============Toy Add==========");
    System.out.println(toyShop.getToyRecipe("Train").getRecipe());
    toyShop.getToys();
  }
}

App을 실행하면 ToyShop클래스를 생성합니다.
ToyShop인스턴스는 객체생성 팩토리 역할을 하는데, 이번 예제에서는 공유할 객체를 미리 정의 하고 호출하는 방식을 사용하였습니다.
getToyRecipe(TOY_NAME)을 호출하면

public Toy getToyRecipe(String toyName){

   Toy toy = toyList.get(toyName);
   if(toy == null){
     if(toyName.equals("Car")){
       toy = new Car();
     }else if(toyName.equals("Cook")){
       toy = new Cook();
     }else if(toyName.equals("Train")){
       toy = new Train();
     }
     toyList.put(toyName, toy);
   }

   return toy;
 }

ToyShop은 기존에 자신이 생성해둔 장난감 객체정보가 있다면 해당 객체를 공유하기위해 반환하고, 없으면 생성합니다.

댓글

Designed by JB FACTORY