2012-02-04 2 views
3

state patternflyweight pattern (예 : 플라이 웨이트 패턴은 메모리를 절약하기 위해 상태 개체를 만드는 데 사용)의 예를 공유 할 수 있습니까?상태 및 FlyWeight 패턴

업데이트 : 주 패턴과 fw 패턴의 조합은 어떻게 사용합니까?

+0

사용하여 쓴 예입니다. 각 패턴마다 하나씩. 그 중 하나를 별도의 질문으로 이동하십시오. – jgauffin

+0

위키 페이지 *에는 예제가 * 있습니다. Java에서. –

+1

@jgauffin 내가 볼 수있는 한, 그가 한 가지 질문을했다. 어떻게 상태와 fw 패턴을 조합 할 것인가. – DPM

답변

3

박싱 예컨대

(작은 정수 값) 오브젝트 생성을 최소화하기 위해 플라이 웨이트 패턴을 사용 Boolean 및 Byte의 경우 가능한 모든 값이 캐시됩니다.

Java는 많은 구성 요소에 대해 상태를 사용하지만 상태 시스템은 상태별로 전환되는 기능도 포함합니다. 여기

난 당신이 두 가지 질문을 가지고 enum http://vanillajava.blogspot.com/2011/06/java-secret-using-enum-as-state-machine.html

+0

* "오토 박싱은 플라이급 패턴의 예"* [sic] ... 조금 이상한 문구와 더 이상한 사례가 아닌가요? 작은 값에 대한 캐싱/재사용은 autoboxing이 수행하는 것과 비교하여 세부 사항이라고 말할 수 있습니다. 또한 플라이급 패턴의 목표는 메모리를 절약하는 것이며 자동 저장은 메모리를 절약하기위한 ** 마지막 ** 항목입니다. Trove TIntIntHashMap에 상응하는 것과 비교하여 기본 Java Map에 정수 {key, values}를 저장할 때 메모리 낭비를 언급하지 않습니다. 그래서 저는 "오토 박싱은 플라이급 패턴의 예"라고 말하면 조금 이상하다고 생각합니다. – TacticalCoder

+1

플라이 웨이트는 실제로 함수가 실제로하는 것과 비교하여 세부적인 것입니다. 이는 대부분 투명하게 디자인 되었기 때문입니다. 즉 성능상의 이유로 순전히 완료됩니다. –

+0

HashMap과 TIntIntHashMap 사용의 차이점은 항목이 구성되는 방식입니다. 정수가 캐시 된 경우 크기는 동일합니다. 예 : 만약 당신이 'TIntArrayList'와'ArrayList '을 비교하면 가치있는 캐시가됩니다. –

1

나는 일반적으로 조건문을 피하기 위해 상태 패턴을 사용합니다. 사용하는 대신

:

switch (state) 
{ 
    case ParserState.BeforeMethod: 
     //do some processing 
     break; 
    case ParserState.InMethod: 
     //do some processing 
     break; 
} 

난 그냥 쓸 수 있습니다 :

currentState = currentState.process(context); 

는 샘플 클래스는 논리, 즉

public class SomeClass : ParserState 
{ 
    public ParserState process(IParserContext context) 
    { 
     //do some proceccing 

     if (m_completed) 
      return new SomeOtherState(); 

     return this; 
    } 

} 

처럼 보일 수는 소규모 클래스로 이동 특정 상태를 처리하는 데 사용됩니다. 명확한 책임

  • 이하 조건문 = 더 읽을 수있는 코드를

    • 작은 클래스 : 그래서 당신은 두 가지를 얻을.
  • 관련 문제