공통으로 사용하는 클래스를 만드는 팩토리 클래스를 두고 사용 클래스의 인스턴스가 팩토리 클래스 내에 있을 시에는 꺼내서 사용하고, 없을 시에는 새로 생성해서 사용하는 패턴
플라이 웨이트 패턴을 통해 메모리 공간을 절약할 수 있다.
기본 설계
FlyWeight를 다루는데 Client가 직접적으로 다루지 않고, FlyWeightFactory를 통해 다루는 것을 볼 수 있다.
public class FlyWeightObject {
private String name;
public FlyWeightObject(String name) throws InterruptedException {
System.out.println(name + " : 객체 생성에 걸리는 시간 1초");
Thread.sleep(1000);
this.name = name;
}
@Override
public String toString() {
return name;
}
}
import java.util.Map;
import java.util.TreeMap;
public class FlyWeightObjectFactory {
private Map<String, FlyWeightObject> pool;
public FlyWeightObjectFactory() {
this.pool = new TreeMap<>();
}
public FlyWeightObject getObject(String key) throws InterruptedException {
FlyWeightObject fwObject = pool.get(key);
if(fwObject == null) {
fwObject = new FlyWeightObject(key);
pool.put(key, fwObject);
}
return fwObject;
}
}
public class TesterFlyweightPattern {
public static void main(String[] args) throws InterruptedException {
FlyWeightObjectFactory fwFactory = new FlyWeightObjectFactory();
FlyWeightObject fwObject = fwFactory.getObject("Justin");
System.out.println(fwObject);
fwObject = fwFactory.getObject("Jordan");
System.out.println(fwObject);
fwObject = fwFactory.getObject("Anna");
System.out.println(fwObject);
fwObject = fwFactory.getObject("Justin");
System.out.println(fwObject);
fwObject = fwFactory.getObject("Justin");
System.out.println(fwObject);
fwObject = fwFactory.getObject("Anna");
System.out.println(fwObject);
fwObject = fwFactory.getObject("Jordan");
System.out.println(fwObject);
}
}
String class에 적용된 flyWeight
String justin1 = "Justin1";
System.out.println("Justin1 : " + justin1.hashCode());
String justin2 = "Justin" + "1";
System.out.println("Justin2 : " + justin2.hashCode());
String justin3 = new String("Justin1");
System.out.println("Justin3 : " + justin3.hashCode());
if(justin1.equals(justin2))
System.out.println("동일값");
if(justin1 == justin2)
System.out.println("동일객체");
'프로그래밍 > OOP_Pattern_TDD' 카테고리의 다른 글
디자인패턴 메멘토 패턴(memento pattern) (0) | 2022.08.02 |
---|---|
디자인패턴 중재자 패턴 (Mediator Pattern) (0) | 2022.08.01 |
디자인패턴 책임 연쇄 패턴 (chain-of-responsibility pattern) (0) | 2022.08.01 |
디자인패턴 빌더 패턴(Builder Pattern) (0) | 2022.07.29 |
디자인패턴 Bridge Pattern (브릿지 패턴) (0) | 2022.07.29 |