Article-No.01 향원 모드

3676 단어 향원 모드
1) GoF가 형원 모델에 대한 설명은 공유 기술을 활용하여 대량의 세립도를 효과적으로 지원하는 대상이다.
Flyweight 모드는 다른 유사한 대상과 데이터를 공유함으로써 메모리 사용을 줄이는 구조 모드 중 하나이다.즉, 한 시스템에 같은 대상이 여러 개 있다면 한 부만 공유하면 되고 한 부씩 실례화할 필요가 없다.Flyweight 모드에서는 다양한 대상이 생겨야 하기 때문에 Flyweight 모드에서 팩토리 모드가 자주 나타난다.Flyweight의 내부 상태는 공유하는 데 사용되며, Flyweight factory는 내부 상태의 대상을 저장하기 위해 대상 저장소(Flyweight Pool)를 유지한다.호출의 편의를 위해 FlyweightFactory 클래스는 일반적으로 Singleton 모드를 사용합니다.Flyweight 모드는 프로그램의 효율과 성능을 향상시키는 모드로 프로그램의 운행 속도를 크게 가속화시킬 수 있다.
2) Flyweight 모드의 유효성은 Flyweight 모드를 어떻게 사용하는지, 어디서 사용하는지에 따라 크게 달라집니다.Flyweight 모드는 다음과 같은 경우에 사용됩니다.
1. 한 응용 프로그램이 대량의 대상을 사용했다.
2. 대량의 대상을 사용하기 때문에 매우 큰 저장 비용을 초래한다.
3. 대상의 대부분 상태가 외부 상태로 바뀔 수 있다.
4. 객체 이외의 상태를 삭제하면 여러 그룹의 객체를 비교적 적은 공유 객체로 대체할 수 있습니다.
5. 응용 프로그램은 대상 표식에 의존하지 않는다.
 
예를 들어 한 카페에는 몇 가지 맛의 커피(라떼, 모카, 카푸치노 등)가 있는데 이 카페가 주문을 받으면 몇 십 잔의 커피가 필요하다.그러면 분명히 커피의 맛은 공유된 것으로 설정할 수 있고 한 잔에 따로 생성할 필요가 없다.코드는 다음과 같습니다.
 
package chapter05_flyWeightPattern;

public abstract class Order {

	// 
	public abstract void sell();
}
package chapter05_flyWeightPattern;

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

public class FlavorFactory {

	private Map<String, Order> flavorPools = new HashMap<String, Order>();
	
	private static FlavorFactory flavorFactory;
	
	private FlavorFactory() {
		
	}
	
	public static FlavorFactory getInstance() {
		if(flavorFactory == null) {
			flavorFactory = new FlavorFactory();
		}
		
		return flavorFactory;
	}
	
	public Order getOrder(String flavor) {
		Order order = null;
		if(flavorPools.containsKey(flavor)) {
			order = flavorPools.get(flavor);
		} else {
			order = new FlavorOrder(flavor);
			flavorPools.put(flavor, order);
		}
		
		return order;
	}
	
	public int getObjCoffee() {
		return flavorPools.size();
	}
}
package chapter05_flyWeightPattern;

public class FlavorOrder extends Order {

	private String flavor;
	
	public FlavorOrder(String flavor) {
		this.flavor = flavor;
	}
	
	@Override
	public void sell() {
		System.out.println(" " + flavor + " ");
	}

}

 
package chapter05_flyWeightPattern;

import java.util.ArrayList;
import java.util.List;

public class Client {

	private static List<Order> orders = new ArrayList<Order>();
	private static FlavorFactory flavorFactory;
	
	private static void addOrder(String flavor) {
		orders.add(flavorFactory.getOrder(flavor));
	}
	
	public static void main(String[] args) {
		flavorFactory = FlavorFactory.getInstance();
		
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		addOrder(" ");
		
		for(Order order : orders) {
			order.sell();
		}
		
		System.out.println(" :" + orders.size() + " !");
		System.out.println(" :" + flavorFactory.getObjCoffee() + " ");
	}
}

 

좋은 웹페이지 즐겨찾기