フライ級モデル
目次
2.2.Webサイト表示プロジェクトを解決するための従来のソリューション
2.3。ウェブサイト表示プロジェクトを解決するためのフライ級モデル
1.フライ級モードの基本的な紹介
1.1基本的な紹介
1)フライウェイトパターン(フライウェイトパターン)、フライウェイトパターンとも呼ばれます:共有テクノロジーを使用して、多数のきめの細かいオブジェクトを効果的にサポートします
2)システムのパフォーマンスの問題を解決するために、システムの最下層の開発でよく使用されます。良好な接続オブジェクトを作成するデータベース接続プールのように、これらの接続オブジェクトの再作成を回避するために直接使用する必要があります。必要がない場合は、
3)フライウェイトモードは、システム内に同様のオブジェクトが多数あり、バッファプールが必要な場合に、重複オブジェクトのメモリ浪費の問題を解決できます。常に新しいオブジェクトを作成する必要はありません。バッファプールから取得できます。これにより、効率を高めながらシステムメモリを削減できます
4)Flyweightモードの典型的なアプリケーションシナリオはプールテクノロジーです。文字列定数プール、データベース接続プール、バッファプールなどはすべてFlyweightモードのアプリケーションです。Flyweightモードはプールテクノロジーの重要な実装方法です。
1.2、フライ級モデルの原理図
1.3、内部状態と外部状態
たとえば、五目並べ、五目並べ、チェッカーなど、すべてチェスの駒がたくさんあります。五目並べと五目並べの色は黒と白だけです。チェッカーの色はもう少し多いので、駒の色は駒の内部状態です。 。ピース間の違いは位置の違いです。ピースを配置した後、ピースの色は固定されますが、位置が変更されるため、ピースの座標はピースの外部状態になります。
1)Flyweightモデルは、きめ細かいオブジェクトと共有オブジェクトの2つの要件を提示します。ここでは、内部状態と外部状態が関係しています。つまり、オブジェクトの情報は、内部状態と外部状態の2つの部分に分けられます。
2)内部状態とは、オブジェクトによって共有される情報を指します。この情報は、flyweightオブジェクトに格納されており、環境の変化によって変化することはありません。
3)外部状態とは、オブジェクトが信頼できるマークのことで、環境によって変化し、共有できない状態です。
4)例:理論的には、囲碁のチェスの駒には361の空の位置があります。各ゲームで、200から300のチェスの駒が生成される可能性があります。メモリスペースが限られているため、サーバーがこれ以上サポートすることは困難です。囲碁ゲームをプレイするプレイヤー。、フライウェイトモードを使用してチェスの駒を処理する場合、チェスの駒のオブジェクトを2つのインスタンスに減らすことができるため、オブジェクトのオーバーヘッドの問題が解決されます。
2、アプリケーション例
2.1。ウェブサイトプロジェクトの問題
2.2.Webサイト表示プロジェクトを解決するための従来のソリューション
ウェブサイト表示プロジェクトを解決するための従来のソリューション-問題分析
1)必要なウェブサイトの構造は非常に似ており、トラフィックの多いウェブサイトではありません。処理のために複数の仮想空間に分割されている場合、同じウェブサイトの多くのインスタンスオブジェクトに相当し、サーバーの浪費になります。リソース
2)ソリューションのアイデア:Webサイトに統合し、関連するコードとデータを共有し、ハードディスク、メモリ、CPU、データベーススペースなどのサーバーリソースを共有して、サーバーリソースを削減します
3)コードについては、例であるため、保守と拡張が簡単です。
4)上記の解決策はフライ級モードを使用して解決できます
2.3。ウェブサイト表示プロジェクトを解決するためのフライ級モデル
ウェブサイト:
public abstract class WebSite {
public abstract void use(User user);//抽象方法
}
ConcreteWebSite:
//具体网站
public class ConcreteWebSite extends WebSite {
//共享的部分,内部状态
private String type = ""; //网站发布的形式(类型)
//构造器
public ConcreteWebSite(String type) {
this.type = type;
}
@Override
public void use(User user) {
// TODO Auto-generated method stub
System.out.println("网站的发布形式为:" + type + " 在使用中 .. 使用者是" + user.getName());
}
}
WebSiteFactory:
// 网站工厂类,根据需要返回压一个网站
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 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;
}
}
3.フライ級モデルのメモと詳細
1)フライ級モデルでは、「シェア」はシェアを意味し、「元」はオブジェクトを意味します
2)システム内に多数のオブジェクトがあり、これらのオブジェクトは大量のメモリを消費し、オブジェクトの状態のほとんどを外部化できる場合は、Flyweightモードの使用を検討できます。
3)一意の識別コードを使用して判断します。メモリ内にある場合は、一意の識別コードで識別されたオブジェクトを返し、HashMap / HashTableに保存します。
4)Flyweightモードは、オブジェクトの作成を大幅に削減し、プログラムのメモリ使用量を削減し、効率を向上させます
5)フライウェイトモードはシステムの複雑さを改善します。内部状態と外部状態を分離する必要があります。外部状態は凝固特性があり、内部状態の変化に伴って変化してはなりません。ここで、フライ級モデルに注意を払う必要があります。
6)フライ級モデルを使用する場合は、内部状態と外部状態の分割に注意してください。ファクトリクラスで制御する必要があります。7)Flyweightモードの従来のアプリケーションシナリオは、文字列定数プール、データベース接続プールなどのバッファプールを必要とするシナリオです。