[디자인패턴] 플라이웨이트 패턴(Flyweight Pattern)

Damsul·2023년 1월 30일
0

디자인패턴

목록 보기
15/15

공통으로 사용하는 클래스(Flyweight)를 생성하는 팩토리 클래스(FlyweightFactory)를 만들어, 인스턴스를 최초 1개만 생성하고 공유하여 재사용할 수 있도록 하는 구조 패턴이다.

출처 : 위키디피아

  • Flyweight : 공유할 객체의 기능을 정의한 인터페이스
  • ConcreteFlyweight : Flyweight 인터페이스 구현체로, 공유에 사용할 클래스
  • UnsharedConcreteFlyweight : Flyweight 인터페이스를 구현체로, 공유에 사용하지 않을 클래스
  • FlyweightFactory : Flyweight 객체를 생성해주는 클래스. 이미 존재하는 객체이면 해당 객체를 반환하고, 존재하지 않는 경우 생성해서 반환
  • Client : Flywieght 패턴을 통해 생성한 객체를 사용하는 클래스

예제

여러대의 컴퓨터에 RAM을 장착한다고 가정해보자. 제조사, 용량별로 다양한 RAM이 필요하고, 각각 객체로 생성되어야 하는데, Flyweight Pattern을 이용하여 공유 객체를 이용하도록 하면 생성되는 객체의 수를 줄일 수 있다.

  • Flyweight

[RamType.java]

public interface RamType {
    void info();
}
  • ConcreteFlyweight

[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 + "]");
    }
}
  • FlyweightFactory

[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

[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();
        }

    }

}
  • 실행 결과

장단점

  • 장점
    • 많은 객체를 만들때 성능을 향상시킬수 있다.
    • 많은 객체를 만들때 메모리를 줄일수 있다.
  • 단점
    • 특정 인스턴스를 다르게 처리하는게 힘들다.
profile
내 맘대로 작성하는 개발일지/ 작고 소중한 개발창고

0개의 댓글