>Java >java지도 시간 >Java 플라이웨이트 디자인 패턴을 사용하여 객체 생성을 최적화하고 성능과 효율성을 향상시키는 방법

Java 플라이웨이트 디자인 패턴을 사용하여 객체 생성을 최적화하고 성능과 효율성을 향상시키는 방법

王林
王林앞으로
2023-05-12 14:13:061136검색

소개

Java의 플라이웨이트 패턴은 가능한 한 많은 객체를 공유하여 메모리 사용량을 줄이고 성능을 향상시키는 것을 목표로 하는 구조적 디자인 패턴입니다.

Java 플라이웨이트 패턴에는 일반적으로 다음 4가지 유형이 포함됩니다. Role

  • Flyweight Factory: 플라이웨이트 객체 생성 및 관리를 담당합니다.

  • Concrete Flyweight: 플라이웨이트 인터페이스를 구현하고 공유 상태와 관련된 내부 상태를 저장합니다.

  • Abstract Flyweight(Flyweight): Flyweight 객체가 필요한 인터페이스 또는 추상 클래스를 정의합니다.

  • 비공유 상태(비공유 상태): Flyweight 개체의 비공유 상태를 저장합니다.

참고: 추상 Flyweight 및 비공유 상태 역할은 선택 사항이며 해당 기능을 다른 역할에 병합하기 위해 생략할 수 있습니다.

클라이언트가 플라이웨이트 개체 생성 또는 액세스를 요청하면 플라이웨이트 팩토리는 개체가 이미 생성되었는지 확인합니다. 이미 생성된 경우, 아직 생성되지 않은 경우 기존 개체에 대한 참조가 반환됩니다. 새로운 객체가 생성되고 해당 참조가 반환됩니다. 이런 방식으로 클라이언트는 새로운 객체를 생성하지 않고도 기존 객체를 공유할 수 있으므로 메모리 사용량이 줄어들고 성능이 향상됩니다.

구현

전자상거래의 제품 정보를 예로 들어보겠습니다. 전자상거래에서는 각 상품마다 이름, 가격, 재고 등의 속성이 있는데, 일반적으로 각 상품마다 별도의 객체를 생성해야 하므로 메모리 점유율이 늘어나고, 동일한 상품을 여러 번 구매하는 경우 시스템이 저하됩니다.

Abstract Flyweight

public interface Product {
    String getName();
    double getPrice();
    int getStock();
}

Concrete Flyweight

public class ConcreteProduct implements Product{
    private String name;
    private double price;
    private int stock;
    public ConcreteProduct(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public double getPrice() {
        return price;
    }
    @Override
    public int getStock() {
        return stock;
    }
}

Flyweight Factory

public class ProductFactory {
    private static Map<String, Product> productMap = new HashMap<>();
    public static Product getProduct(String name, double price, int stock) {
        String key = name + "_" + price;
        Product res = productMap.get(key);
        if (Objects.isNull(res)) {
            // 如果缓存池内不存在,就创建新对象放置到缓存池
            res = new ConcreteProduct(name, price, stock);
            productMap.put(key, res);
        }
        return res;
    }
}

Test

public class Demo {
    public static void main(String[] args) {
        Product p1 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        Product p2 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
        System.out.println(p1 == p2);
    }
}

Java 플라이웨이트 디자인 패턴을 사용하여 객체 생성을 최적화하고 성능과 효율성을 향상시키는 방법

위의 예제 코드에서 먼저 제품 인터페이스 Product를 생성합니다. , 가격, 재고 및 기타 제품 속성을 생성하고, Product 인터페이스를 구현하고, 공유 내부 상태 이름, 가격 및 재고를 정의합니다. 이 팩토리에서는 공유 제품 객체를 저장하기 위해 HashMap을 사용합니다. 클라이언트가 제품을 구매해야 할 때마다 먼저 제품 객체가 생성되었는지 확인합니다. 기존 객체가 생성되지 않은 경우 새 객체가 생성되어 HashMap에 저장되고 해당 참조가 반환됩니다.

Summary

Advantages

  • 객체 생성을 줄이고 메모리 공간을 절약합니다.

  • 객체를 공유하면 시스템에 있는 동일한 객체의 복사본 하나만 메모리에 존재할 수 있으므로 메모리 오버헤드가 줄어듭니다.

  • 필요한 경우 시스템 확장성을 향상시킵니다. 공장에서 생성하기만 하면 되며 원본 코드를 수정할 필요가 없습니다.

  • 공유 개체는 읽기 전용이며 수정되지 않습니다.

단점

  • 시스템을 너무 복잡하게 만들고 코드의 복잡성을 증가시킬 수 있습니다.

  • 스레드 안전성 및 기타 문제 등 공유 객체의 일관성을 유지하기 위해 추가 작업이 필요합니다.

  • 공유로 인한 것일 수 있습니다. 객체가 존재하면 공유 객체를 개인화할 수 없는 등 프로그램의 유연성이 감소합니다.

응용 시나리오

  • 시스템에 동일하거나 유사한 객체가 많으면 Flyweight 사용을 고려할 수 있습니다. 메모리 오버헤드를 줄이기 위한 패턴입니다.

  • 객체를 캐시하고 재사용해야 하는 경우 플라이웨이트 모드 사용을 고려할 수도 있습니다.

  • 멀티 스레드 환경에서는 플라이웨이트 모드를 사용하여 객체 공유를 달성할 수 있습니다. 프로그램 동시성을 향상시킵니다.

  • 게임 개발 시 플라이웨이트 모드를 사용하여 게임 내 캐릭터 등의 개체를 관리할 수 있습니다.

위 내용은 Java 플라이웨이트 디자인 패턴을 사용하여 객체 생성을 최적화하고 성능과 효율성을 향상시키는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제