Flyweight デザイン パターンの解釈

目次

問題紹介

Web サイト プロジェクトの要件を示す

ウェブサイト表示プロジェクトを解決するための従来のソリューション

Web サイト表示プロジェクトの問題分析に対する従来のソリューション 

Flyweight モードの基本的な紹介

基本紹介

 フライウェイトモードの原理クラス図

クラス図の説明

内部状態と外部状態 

Flyweight モードは Web サイト表示プロジェクトを解決します 

アプリケーション例の要件

アイデア分析と図(クラス図)

 コード

 JDK-Interger での Flyweight モードのアプリケーション ソース コード分析

フライウェイトモードの注意事項と詳細 


問題紹介

Web サイト プロジェクトの要件を示す

顧客 A の商品表示 Web サイトを構築する小規模なアウトソーシング プロジェクトです。顧客 A の友人は効果が高いと感じており、そのような製品表示 Web サイトを構築したいと考えていますが、要件は多少異なります。1) 一部の顧客ニュース形式での公開希望 2
)
はい お客様からブログ形式での公開希望
3) 一部のお客様は WeChat 公式アカウント形式での公開を希望

ウェブサイト表示プロジェクトを解決するための従来のソリューション

1) コピーを直接コピーして貼り付け、顧客のさまざまな要件に応じてカスタマイズおよび変更する
2) 各 Web サイトのスペースを借りる
3) スキーム設計の概略図

Web サイト表示プロジェクトの問題分析に対する従来のソリューション 

必要なWebサイトの構造は非常に似ており、訪問者数の多いWebサイトではありません.複数の仮想空間に分割して処理すると、同じWebサイトの多数のインスタンスオブジェクトに相当し、サーバーの浪費につながります.リソース. コードの場合,
インスタンスであるため, メンテナンスと拡張が容易.
上記の解決策は、フライウェイトモードを使用して解決できます.

解決策: ウェブサイトに統合し、関連するコードとデータを共有し、ハードディスク、メモリ、CPU、データベース スペースなどのサーバー リソースを共有し、サーバー リソースを削減します。

Flyweight モードの基本的な紹介

基本紹介

1) Flyweight パターン (Flyweight パターン) は flyweight パターンとも呼ばれます: 共有テクノロジを使用して、多数のきめ細かいオブジェクトを効果的にサポートします
2) システムの基本的な開発でシステム パフォーマンスの問題を解決するためによく使用されます。データベース接続プールと同様に、そこには作成されたすべての接続オブジェクトがあります. これらの接続オブジェクトに必要な接続オブジェクトがある場合は、それらを直接使用して再作成を避けることができます. 必要なものがない場合は作成します. 3) フライウェイト モードは重複を解決できます
オブジェクト メモリの浪費の問題。システム内に多数の同様のオブジェクトがある場合、バッファ プールが必要です。常に新しいオブジェクトを作成する必要はなく、バッファー プールから取得できます。これにより、システム メモリを削減し、同時に効率を向上させることができます.
4) Flyweight モードの古典的なアプリケーション シナリオはプール テクノロジです. 文字列定数プール、データベース接続プール、バッファ プールなどは、すべて Flyweight モードのアプリケーションです. Flyweight モードは、プール技術の中核、重要な実装

 フライウェイトモードの原理クラス図

クラス図の説明

模式図の説明 - つまり (パターンの役割と責任)
1) FlyWeight は、製品の抽象クラスである抽象 Flyweight 役割であり、外部状態と内部状態のインターフェイスまたは実装を定義します (説明2) ConcreteFlyWeight は
、特定の製品カテゴリである特定の Flyweight ロールであり、抽象的なロール定義関連のビジネスを実現します
3) UnSharedConcreteFlyWeight は、共有できないロールであり、通常は表示されませんフライ級工場。
4) FlyWeightFactory Flyweight ファクトリ クラス。プール コンテナー (コレクション) を構築するために使用され、プールからオブジェクトを取得するためのメソッドを提供します。 

内部状態と外部状態 

例えば、囲碁、バックギャモン、チェッカーはすべてチェスの駒の数が多い. 囲碁とバックギャモンは黒と白の色しかなく、チェッカーはより多くの色を持っているので、駒の色は駒の内部状態です.駒の違いは位置の違いです駒を置いた後は駒の色は固定ですが、位置が変わるので駒の座標が駒の外見状態になります


Flyweight モードでは、細粒度オブジェクトと共有オブジェクトという 2 つの要件が提示されます。ここでは、内部状態と外部状態が関係しています。つまり、オブジェクトの情報は、内部状態と外部状態の 2 つの部分に分けられます。

内部状態とは、オブジェクトによって共有される情報を指します。この情報は flyweight オブジェクト内に保存され、環境によって変化しません。

外部状態とは、オブジェクトが依存できるマークを指し、環境によって変化し、共有できない状態です。 

例: 囲碁では理論上、チェスの駒に 361 の空きがあり、各ゲームには 200 ~ 300 のチェスの駒がある場合があります. メモリ容量が限られているため、サーバーがより多くのプレイヤーが囲碁をプレイできるようにサポートすることは困難です. フライウェイトを使用する場合モードでチェスの駒を処理すると、チェスの駒オブジェクトを 2 つのインスタンスに減らすことができ、オブジェクトのオーバーヘッドの問題が非常にうまく解決されます。 

Flyweight モードは Web サイト表示プロジェクトを解決します 

アプリケーション例の要件

Flyweight モードを使用して、以前に提起された Web サイトのアウトソーシングの問題を完了します

アイデア分析と図(クラス図)

 コード

Webサイト  

public abstract class WebSite {
    public abstract void use(User user);//抽象方法
}

具体的なウェブサイト  

public class ConcreteWebSite extends WebSite {
    //共享的部分,内部状态
    private String type = ""; //网站发布的形式(类型)

    //构造器
    public ConcreteWebSite(String type) {
        this.type = type;
    }

    @Override
    public void use(User user) {
        System.out.println("网站的发布形式为:" + type +
                " 在使用中 .. 使用者是" + user.getName());
    }

}

 ユーザー 

public class User {
    private String name;

    public User(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

ウェブサイトファクトリー  

public class WebSiteFactory {
    private HashMap<String, ConcreteWebSite> pool = new HashMap<>();

    //根据网站的类型,返回一个网站, 如果没有就创建一个网站,并放入到池中,并返回
    public WebSite getWebSiteCategory(String type) {
        if (!pool.containsKey(type)) {
            //就创建一个网站,并放入到池中
            pool.put(type, new ConcreteWebSite(type));
        }
        return (WebSite) pool.get(type);
    }

    //获取网站分类的总数 (池中有多少个网站类型)
    public int getWebSiteCount() {
        return pool.size();
    }
}

クライアント  

public class Client {
    public static void main(String[] args) {
        // 创建一个工厂类
        WebSiteFactory factory = new WebSiteFactory();
        // 客户要一个以新闻形式发布的网站
        WebSite webSite1 = factory.getWebSiteCategory("新闻");
        webSite1.use(new User("tom"));
        // 客户要一个以博客形式发布的网站
        WebSite webSite2 = factory.getWebSiteCategory("博客");
        webSite2.use(new User("jack"));
        // 客户要一个以博客形式发布的网站
        WebSite webSite3 = factory.getWebSiteCategory("博客");
        webSite3.use(new User("smith"));
        // 客户要一个以博客形式发布的网站
        WebSite webSite4 = factory.getWebSiteCategory("博客");
        webSite4.use(new User("king"));
        System.out.println("网站的分类共=" + factory.getWebSiteCount());
    }
}

 JDK-Interger での Flyweight モードのアプリケーション ソース コード分析


1. valueOf メソッドでは、最初に値が IntegerCache にあるかどうかを判断し、そうでない場合は新しい Integer (new) を作成し、そうでない場合はキャッシュ プールから直接返します 2. valueOf メソッドは Flyweight モードを使用します 3.
use valueOf メソッドは Integer インスタンスを取得し、範囲は -128 ~ 127 で、実行速度は new より高速です

フライウェイトモードの注意事項と詳細 

1) Flyweight モードでは、「Share」は共有を意味し、「Yuan」はオブジェクトを意味します
2) システムには多数のオブジェクトがあり、これらのオブジェクトは多くのメモリを消費し、オブジェクトの状態のほとんどはFlyweight モードを選択する
3) 一意の識別コードを使用して判断し、メモリに存在するかどうかを判断し、一意の識別コードで識別されるオブジェクトを返し、HashMap/HashTable に格納します 4) Flyweight モードは大幅に削減し
ますオブジェクトの作成とプログラム占有率のメモリの削減、効率の向上
5) Flyweight モードでは、システムの複雑さが増します。内部状態と外部状態を分離する必要があり、外部状態は固化する性質があり、内部状態の変化に伴って変化してはならない.フライウェイトパターンを使用する際には、この点に注意する必要がある. flyweight パターンを使用する場合、内部状態 State と外部状態の分割に注意し
、制御するファクトリ クラスが必要です。
7) Flyweight モードの古典的なアプリケーション シナリオは、文字列定数プール、データベース接続プールなどのバッファー プールを必要とするシナリオです。

おすすめ

転載: blog.csdn.net/m0_62436868/article/details/130205978