ホームページ >Java >&#&チュートリアル >Java フライウェイト設計パターンを使用してオブジェクト作成を最適化し、パフォーマンスと効率を向上させる方法

Java フライウェイト設計パターンを使用してオブジェクト作成を最適化し、パフォーマンスと効率を向上させる方法

王林
王林転載
2023-05-12 14:13:061135ブラウズ

はじめに

Java の Flyweight パターンは、できるだけ多くのオブジェクトを共有することでメモリ使用量を削減し、パフォーマンスを向上させることを目的とした構造的な設計パターンです。

Java Flyweight モードには通常、次のものが含まれます。 4 つの役割

  • #Flyweight Factory: フライウェイト オブジェクトの作成と管理を担当します。

  • Concrete Flyweight (Concrete Flyweight): フライウェイト インターフェイスを実装し、ストアします共有状態に関連する内部状態

  • 抽象フライウェイト (Flyweight): フライウェイト オブジェクトが実装する必要があるインターフェイス、または抽象クラスを定義します。

  • 非共有状態: フライウェイト オブジェクトの非共有状態を保存します。

注: 抽象フライウェイト ロールと非共有状態ロールはオプションであり、機能を他のロールにマージするために省略できます。役割

クライアントがフライウェイト オブジェクトの作成またはアクセスを要求すると、フライウェイト ファクトリは、フライウェイト オブジェクトがすでに作成されているかどうかを確認します。作成されている場合は、既存のオブジェクトへの参照が返されます。が作成されていない場合は、新しいオブジェクトが作成され、その参照が返されます。このようにして、クライアントは新しいオブジェクトを作成することなく既存のオブジェクトを共有できるため、メモリ使用量が削減され、パフォーマンスが向上します。

実装

電子商取引における商品情報を例に挙げます。電子商取引では、各商品には名前、価格、在庫などの属性があります。通常、商品ごとに個別のオブジェクトを作成する必要があるため、メモリ使用量が増加します。同じ製品を複数回購入すると、システムは複数の同一のオブジェクトを作成し、リソースを無駄にします。

抽象フライウェイト

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

特定のフライウェイト

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;
    }
}

フライウェイト ファクトリー

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 を作成します。次に、特定の製品クラス ConcreteProduct を作成し、Product インターフェイスを実装し、共有内部状態の名前、価格、および在庫を定義します。次に、共有製品オブジェクトを作成および管理するための製品ファクトリ ProductFactory を作成します。このファクトリでは、HashMap を使用して格納します共有製品オブジェクト。クライアントが製品を購入する必要があるときは、まず製品オブジェクトが作成されているかどうかを確認します。作成されている場合は、既存のオブジェクトへの参照を返します。作成されていない場合は、新しいオブジェクトを作成し、それを HashMap に保存し、その参照を返します。

##オブジェクトを共有すると、システム内の同じオブジェクトのコピーが 1 つだけメモリ内に存在できるため、メモリのオーバーヘッドが削減されます。

  • スケーラビリティの向上新しいオブジェクトを追加する必要がある場合は、元のコードを変更せずにファクトリでオブジェクトを作成するだけで済みます。

  • システムのセキュリティが向上します。共有オブジェクトは読み取られます。

  • #欠点
  • システムが複雑になりすぎて、コードの複雑さが増大する可能性があります。
  • 共有オブジェクトの一貫性を維持するには、スレッド セーフやその他の問題を考慮する必要があるなど、追加の作業が必要です。

    共有オブジェクトの数が多いと、プログラムの柔軟性が低下する可能性があります。たとえば、共有オブジェクトをパーソナライズすることはできません。
  • アプリケーション シナリオ
  • システム内に同一または類似のオブジェクトが多数ある場合は、フライウェイト モードを使用してメモリ オーバーヘッドを削減することを検討できます。
  • オブジェクトをキャッシュする必要があり、再利用できる場合は、次のことも検討できます。 flyweight モードを使用します。

    マルチスレッド環境では、flyweight モードを使用してオブジェクト共有を実現し、プログラムの同時実行パフォーマンスを向上させることができます。
  • ゲーム開発では、フライウェイト モデルを使用して、ゲーム内のキャラクターなどのオブジェクトを管理できます。

以上がJava フライウェイト設計パターンを使用してオブジェクト作成を最適化し、パフォーマンスと効率を向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。