패브릭 모드 - 형원 모드

5401 단어 향원 모드
형원 모드: 공유된 방식으로 높은 글라이딩을 지원하는 대량의 세립도 대상
향원 대상이 공유할 수 있는 관건은 내포 상태와 외포 상태를 구분하는 것이다. 그들은 이전에 서로 영향을 주지 않고 독립했다.
하나의 내장 상태는 향원 원소 내부에 저장되어 있고 세 환경의 변화에 따라 달라지지 않기 때문에 하나의 향원은 내장 상태를 가지고 공유할 수 있다
하나의 외포 상태는 환경의 변화에 따라 바뀌어 공유할 수 없는 상태이다.향원 대상의 외포 상태는 반드시 클라이언트가 보관하고 향원 대상이 창설된 후에 사용해야 할 때 향원 대상 내부로 전송해야 한다.
향원 모델은 단독 향원 모델과 복합식 향원 모델로 나뉜다.
 
형원공장:
package com.javapatterns.flyweight.simple;

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

public class FlyweightFactory {
	private HashMap flies = new HashMap();
	/**
	 * @link aggregation
	 * @directed
	 * @clientRole Flyweights
	 */
	private Flyweight lnkFlyweight;

	public FlyweightFactory() {
	}

	public synchronized Flyweight factory(Character state) {
		if (flies.containsKey(state)) {
			return (Flyweight) flies.get(state);
		} else {
			Flyweight fly = new ConcreteFlyweight(state);
			flies.put(state, fly);
			return fly;
		}
	}

	public void checkFlyweight() {
		Flyweight fly;
		int i = 0;

		System.out.println("
==========checkFlyweight()============="); for (Iterator it = flies.entrySet().iterator(); it.hasNext();) { Map.Entry e = (Map.Entry) it.next(); System.out.println("Item " + (++i) + " : " + e.getKey()); } System.out.println("==========checkFlyweight()============="); } }

추상 향원 역할:
package com.javapatterns.flyweight.simple;

abstract public class Flyweight
{
    abstract public void operation(String state);
}

 
구체적인 향원 역할:
package com.javapatterns.flyweight.simple;

public class ConcreteFlyweight extends Flyweight
{
    private Character intrinsicState = null;

	public ConcreteFlyweight(Character state)
	{ 
		this.intrinsicState = state;
	}
	
	public void operation(String state)
	{ 
		System.out.print( "
Intrinsic State = " + intrinsicState + ", Extrinsic State = " + state); } }

 
 
클라이언트:
package com.javapatterns.flyweight.simple;

public class Client
{
    private static FlyweightFactory factory;

    static public void main(String[] args)
	{ 
		factory = new FlyweightFactory();

		Flyweight fly = factory.factory(new Character('a'));
		fly.operation("First Call");
		
		fly = factory.factory(new Character('b'));
		fly.operation("Second Call");
		
		fly = factory.factory(new Character('a'));
		fly.operation("Third Call");
		
		// intrinsic Flyweight
		factory.checkFlyweight();
	} 
}

 
 
복합 향원 모드:
추상 향원 역할:
package com.javapatterns.flyweight.composite;

abstract public class Flyweight
{
    abstract public void operation(String state); 
}

 
구체적인 향원 역할:
package com.javapatterns.flyweight.composite;

public class ConcreteFlyweight extends Flyweight
{
    private Character intrinsicState = null;

	public ConcreteFlyweight(Character state)
	{ 
		this.intrinsicState = state;
	}
	
	public void operation(String state)
	{ 
		System.out.print( "
Internal State = " + intrinsicState + " Extrinsic State = " + state ); } }

 
복합 향원 역할:
package com.javapatterns.flyweight.composite;

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

public class ConcreteCompositeFlyweight extends Flyweight 
{
    private HashMap flies = new HashMap(10);

    /**
     * @link aggregation
     * @directed
     * @clientRole Composite
     */
    private Flyweight flyweight;

	public ConcreteCompositeFlyweight()
	{ 
	}
	
	public void add(Character key, Flyweight fly)
	{ 
		flies.put(key, fly);
	}
	
	public void operation(String extrinsicState)
	{
        Flyweight fly =  null;

		for ( Iterator it = flies.entrySet().iterator() ; it.hasNext() ;  )
        {
			Map.Entry e = (Map.Entry) it.next();
            fly = (Flyweight) e.getValue();

            fly.operation(extrinsicState);
        }
	}
}


클라이언트:
package com.javapatterns.flyweight.composite;

public class Client
{
    private static FlyweightFactory factory;

    public static void main(String[] args)
	{ 
		factory = new FlyweightFactory();

		Flyweight fly;
		
        fly = factory.factory("abc");
        fly.operation("Composite Call");
		
		factory.checkFlyweight();
	} 
}

좋은 웹페이지 즐겨찾기