공통으로 사용하는 클래스(Flyweight)를 생성하는 팩토리 클래스(FlyweightFactory)를 만들어, 인스턴스를 최초 1개만 생성하고 공유하여 재사용할 수 있도록 하는 구조 패턴이다.
- Flyweight : 공유할 객체의 기능을 정의한 인터페이스
- ConcreteFlyweight : Flyweight 인터페이스 구현체로, 공유에 사용할 클래스
- UnsharedConcreteFlyweight : Flyweight 인터페이스를 구현체로, 공유에 사용하지 않을 클래스
- FlyweightFactory : Flyweight 객체를 생성해주는 클래스. 이미 존재하는 객체이면 해당 객체를 반환하고, 존재하지 않는 경우 생성해서 반환
- Client : Flywieght 패턴을 통해 생성한 객체를 사용하는 클래스
여러대의 컴퓨터에 RAM을 장착한다고 가정해보자. 제조사, 용량별로 다양한 RAM이 필요하고, 각각 객체로 생성되어야 하는데, Flyweight Pattern을 이용하여 공유 객체를 이용하도록 하면 생성되는 객체의 수를 줄일 수 있다.
[RamType.java]
public interface RamType {
void info();
}
[Ram.java]
public class Ram implements RamType{
String company;
int volume;
public Ram(String company) {
this.company = company;
}
public void setVolume(int volume) {
this.volume = volume;
}
@Override
public void info() {
System.out.println("RAM [company=" + this.company + ", volume=" + this.volume + "]");
}
}
[RamFactory.java]
public class RamFactory {
private static final HashMap<String, Ram> ramMap = new HashMap<>();
public static Ram manufactureRam(String company) {
Ram ram = ramMap.get(company);
if (ram == null) {
ram = new Ram(company);
ramMap.put(company, ram);
System.out.println("====새로운 RAM 제조 : " + company + " company====");
}
return ram;
}
}
[Client.java]
public class Client {
public static void main(String[] args) {
String[] companies = {"Samsung", "Hynix", "Micron"};
int[] volumes = {4, 8, 16, 32};
for (int i = 0; i < 10; i++) {
Ram ram = RamFactory.manufactureRam(companies[(int) (Math.random() * 3)]);
ram.setVolume(volumes[(int) (Math.random() * 4)]);
ram.info();
}
}
}