publicclassClient {publicstaticvoidmain(String[] args) {// Factory 생성FlyweightFactory flyweightFactory =newFlyweightFactory();Flyweight flyweight0 =flyweightFactory.getFlyweight("A");System.out.println(flyweight0.operation(100));Flyweight flyweight1 =flyweightFactory.getFlyweight("A");System.out.println(flyweight1.operation(200));Flyweight flyweight2 =flyweightFactory.getFlyweight("B");System.out.println(flyweight2.operation(300));System.out.println(String.format("\n *** 생성된 Flyweight1 갯수 %d ***",flyweightFactory.getSize()));System.out.println(String.format("\n *** flyweight0 주소 = %s ***",System.identityHashCode(flyweight0)));System.out.println(String.format("\n *** flyweight1 주소 = %s ***",System.identityHashCode(flyweight1)));System.out.println(String.format("\n *** flyweight2 주소 = %s ***",System.identityHashCode(flyweight2))); }}
결과 : flyweight0 , flyweight1의 주소가 같은 것을 확인 할 수 있다,
생성 객체 flyweight key = A
Flyweight1 내부상태(intrinsicStatus) = A, 외부 상태 = 100
공유 객체 flyweight key = A Flyweight1
내부상태(intrinsicStatus) = A, 외부 상태 = 200
생성 객체 flyweight key = B Flyweight1
내부상태(intrinsicStatus) = B, 외부 상태 = 300
*** 생성된 Flyweight1 갯수 2 ***
*** flyweight0 주소 = 687780858 ***
*** flyweight1 주소 = 687780858 ***
*** flyweight2 주소 = 1734161410 ***
싱클톤 패턴과 차이점
싱클톤 패턴은 가변(mutable)으로 Application내에 클래스를 하나의 인스턴스로 제한하는 것입니다. 클래스를 하나의 인스턴스로 제한한다는 것은 한번만 메모리 할당 하고 그 이후엔 그 인스턴스를 받아서 사용하는 패턴으로 꼭 하나만 존재하고자 할때 사용한다. 그러나 Flyweight는 불변(immutable)로 여러 종류의 단 하나를 가질 수 있다 ( 예: 사과, 배는 과일이다 )