この記事の出所:GitHubにはこちらをクリック・ || GitEEは・こちらをクリック
まず、利用シーン
アプリケーションコード
public class C01_InScene {
public static void main(String[] args) {
String c0 = "cicada" ;
String c1 = "cicada" ;
System.out.println(c0 == c1); // true
}
}
文字列型は、Flyweightパターンを使用することです。Stringオブジェクトは、それが作成されると、オブジェクトを変更することはできません、最終的です。文字列定数は、定数プールはJAVAに存在している、JAVAは、C0とC1は、文字列定数である定数プール内の文字列定数のコピーを1つだけ確実にします。結果は次のとおりです。本当、同じ文字列定数の定数プール「蝉」にC0とC1の2つの参照点を説明します。あなたはより多く生産さNの同一のオブジェクトよりを作成すると、このデザインは、大量のリソースの無駄な消費を回避することができます。
第二に、フライ級
1.はじめに換算
フライ級は、構成オブジェクトモデルです。効率的にきめ細かな多数のオブジェクトをサポートするための共有方法にフライ級のパターン。一般に、システムのパフォーマンスの問題に対処するために、低レベルの現像システムで使用されます。優れた接続オブジェクトを作成することであるデータベース接続プールと同様に、直接再作成を回避するために使用されているこれらの接続オブジェクトが必要とされています。
図2に示すように、パターンを示し
3、中核的な役割
- 抽象フライ級の役割
これは、共有の方法を達成するために、特定の役割を定義するための抽象インタフェースを提供します。
- フライ級、特定の役割
抽象インタフェースが役割を定義された実装をお楽しみください。内部状態があれば、それは内部状態のストレージ容量を提供しなければなりません。
- フライ級の工場の役割
フライ級役割の作成と管理を担当。フライ級は、オブジェクトが選択システムを共有できることを確認する必要があります。クライアントが目標オブジェクトフライ級の時間を呼び出すと、すでに存在する場合に役割の要件を満たすために、ターゲットフライ級フライ級の工場では、システムをチェックします。オブジェクトへの直接のリターンがあった場合、システムはフライ級を対象としていない場合、フライ級の工場は、ロールフライ級オブジェクトを作成する必要があります。
図4に示すように、内部および外部の状態
- これは、環境の変化にフライ級内部オブジェクトに格納されたオブジェクトの共有情報のうち、内部状態を参照し、変化しません。
- 外部状態は、標識した標的依存を意味し、環境の変化ではなく、共有状態を変更することができます。
図5に示すように、ソースコードの実装
public class C02_FlyWeight {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly = factory.factoryMethod('c');
fly.printState("One");
fly = factory.factoryMethod('d');
fly.printState("Two");
fly = factory.factoryMethod('c');
fly.printState("San");
// 调用了三次工厂方法,只创建了两个对象
factory.poolInfo();
}
}
/**
* 抽象享元角色类
*/
interface Flyweight {
void printState (String state);
}
/**
* 具体享元角色类
*/
class ConcreteFlyweight implements Flyweight {
private Character innerState = null;
public ConcreteFlyweight (Character state){
this.innerState = state;
}
@Override
public void printState(String state) {
System.out.println("内部状态:" + this.innerState);
System.out.println("外部状态:" + state);
}
}
/**
* 享元工厂角色类
*/
class FlyweightFactory {
// 模拟数据池
private Map<Character,Flyweight> pool = new HashMap<>();
public Flyweight factoryMethod (Character state){
//先从缓存中查找对象
Flyweight fly = pool.get(state);
if(fly == null){
fly = new ConcreteFlyweight(state);
pool.put(state, fly);
}
return fly;
}
public void poolInfo (){
System.out.println("数据池:"+pool);
}
}
三、JDKのシナリオ
- テストブロック
public class C03_Integer { public static void main(String[] args) { Integer c1 = Integer.valueOf(127),c2 = Integer.valueOf(127) ; Integer c3 = new Integer(127),c4 = new Integer(127) ; boolean flag1 = c1==c2 ,flag2 = c2==c3,flag3 = c3==c4 ; // true;false;false System.out.println(flag1+";"+flag2+";"+flag3); Integer c5 = Integer.valueOf(222),c6=Integer.valueOf(222) ; // false System.out.println(c5==c6); } }
- ソースコード解析
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
ここで意味valueOfメソッドは、着信データキャッシュから直接リターンとの間(127)から(-128)、または、新しいIntegerオブジェクトを作成する場合ということです。
第四に、モデルの概要
必要なときにシステムが同様の多数のオブジェクト、バッファ・プールを有する場合、廃棄物の問題を解決するためのフライメモリ繰り返しオブジェクト。新しいオブジェクトを作成せずにされている、あなたは、バッファプールから取得することができます。効率を高めながらこれは、システムメモリを減らすことができます。古典的なシナリオは、技術プール、文字列定数プール、データベース接続プール、プールですので、アプリケーションのFlyweightパターンあり、Flyweightパターンは、セル技術を達成するための重要な方法です。フライ級は、システムがより複雑になります。オブジェクトを共有することができるようにするためには、時間管理は、ロジックが複雑になる可能オブジェクトの状態を変更する必要があります。
第五に、ソースコードのアドレス
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent