Flyweight 패턴
- Programming/디자인패턴
- 2020. 5. 12.
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은 기존에 자신이 생성해둔 장난감 객체정보가 있다면 해당 객체를 공유하기위해 반환하고, 없으면 생성합니다.