ヤン・ホン博士の本「Java and Mode」では、フライ級モードの説明から始まります。
フライ級は、最も軽い重量レベル、つまり「フライウェイト」または「雨レベル」を指します。 「xienyuanモード」の翻訳は、モードの意図をよりよく反映できるため、ここで選択されます。百科事典パターンは、オブジェクトの構造パターンです。百科事典モードは、共有された方法で多数のきめ細かいオブジェクトを効率的にサポートします。
Javaの文字列タイプ
Java言語では、文字列タイプは百科事典モードを使用します。文字列オブジェクトは最終型であり、作成されると変更できません。 Javaでは、一定のプールに文字列定数が存在します。 Javaは、文字列定数が定数プールに1つのコピーしかないことを保証します。文字列a = "abc"。ここで、「abc」は文字列定数です。
public class test {public static void main(string [] args){string a = "abc";文字列b = "abc"; System.out.println(a == b); }}上記の例の結果は真です。つまり、AとBの両方が定数プールの同じ文字列定数「ABC」を指します。このような設計は、N以上の同一のオブジェクトを作成するときに生成される不必要なリソース消費を避けます。
楽しさモデルの構造
Funy Modelは、同じコンテンツオブジェクトを持つというオーバーヘッドを避けるために共有を採用します。このオーバーヘッドで最も一般的で直感的なことは、記憶喪失です。百科事典オブジェクトを共有するための鍵は、内部状態と外部状態を区別することです。
固有の状態はXiangyuanオブジェクトの内部に保存され、環境とは変化しません。したがって、犠牲要素は本質的な状態を持つことができ、共有できます。
外部状態は環境の変化とともに変化し、共有できません。 Xiangyuanオブジェクトの外部状態はクライアントによって保存する必要があり、Xiangyuanオブジェクトが作成された後、使用する必要があるときにXiangyuanオブジェクトに渡されます。外部状態は、生きているオブジェクトの内部状態に影響を与えることができず、互いに独立しています。
ユアンモードを楽しむことは、2つのフォームに分けることができます。ファイニングユーアンモードとコンポジットを楽しむ元モードです。
シンプルな楽しみモード
単純な現存モードでは、すべての現存するオブジェクトを共有できます。
単純な楽しみモードに伴う役割は次のとおりです。
抽象的なフライ級の役割:すべての特定のフライ級ロールを実装する必要がある方法を指定するための抽象インターフェイスを提供します。
Concreteflyightの役割:抽象的なXiangyuanの役割によって指定されたインターフェイスを実装します。本質的な状態がある場合、本質的な状態にストレージスペースを提供する責任がなければなりません。
FlyWeightFactoryの役割:この役割は、Xiangyuanの役割の作成と管理に責任があります。この役割は、システムによってFouncementオブジェクトを適切に共有できるようにする必要があります。クライアントオブジェクトがXiangyuanオブジェクトを呼び出すと、Xiangyuan Factoryの役割は、システム内の要件を満たすXiangyuanオブジェクトがすでにあるかどうかを確認します。すでに存在する場合、Xiangyuanの工場の役割は既存のXiangyuanオブジェクトを提供する必要があります。システムに適切なXiangyuanオブジェクトがない場合、Xiangyuan Factoryの役割は適切なXiangyuanオブジェクトを作成する必要があります。
ソースコード
抽象文字クラス
パブリックインターフェイスフライ級{//回路図メソッド、パラメーター状態は外部状態のパブリックボイド操作(String State);}です。特定の百科事典のキャラクタークラスconcreteflywightには、本質的な状態があります。この例では、文字型の本質的なステートプロパティを表し、百科事典オブジェクトが作成されるときにその値を割り当てる必要があります。すべての固有の状態は、オブジェクトが作成された後に変更されません。
犠牲オブジェクトに外部状態がある場合、すべての外部状態をクライアントに保存する必要があります。犠牲オブジェクトを使用する場合、犠牲オブジェクトはクライアントによって犠牲オブジェクトに渡されます。ここには外部状態は1つだけで、操作()メソッドのパラメーター状態は、外部から渡された外部状態です。
パブリッククラスのconcreteflyightは、flyweight {private chargetle intrinsicstate = null; / ***コンストラクター、内因性状態はパラメーターとして渡されます* @param State*/ public Concreteflywight(Chargetwe State){this.intrinsicState = state; } /** *外部状態はメソッドのパラメーターとして渡され、メソッドの動作を変更しますが、オブジェクトの固有の状態は変更されません。 */ @Override public void operation(String state){// todo auto-enerated method stub.out.println( "intrinsic state =" + this.intrinsicstate); system.out.println( "extinsic state =" + state); }}Xiangyuan Factoryの役割クラスの場合、クライアントは特定のXiangyuanクラスを直接インスタンス化することはできませんが、Factory()メソッドを使用してXiangyuanオブジェクトを取得する必要があることを指摘する必要があります。一般的に言えば、システム全体にXiangyuan工場オブジェクトは1つしかないため、Singletonモードも使用できます。
クライアントが単純なFunymentオブジェクトを必要とする場合、Factory()のFactory()メソッドをFace Factory()メソッドを呼び出し、必要な内部状態のFace Factoryに渡す必要があり、工場メソッドは必要なFeanオブジェクトを生成します。
Public Class FlyWeightFactory {Private Map <Character、Flyweight> files = new Hashmap <Character、Flyweight>(); Public Flyweight Factory(Character State){// Cache Flyweight Fly = files.get(state)のオブジェクトを最初に探します。 if(fly == null){//オブジェクトが存在しない場合、新しいフライ級オブジェクトを作成しますfly = new Concreteflyight(state); //この新しいフライ級オブジェクトをcache files.put(state、fly)に追加します。 }フライを返します。 }}クライアントクラス
public class client {public static void main(string [] args){// dodo auto-enerated method stub flyweightfactory = new FlyWeightFactory(); Flyweight Fly = Factory.Factory(new Character( 'A')); fly.operation( "First Call"); fly = factory.factory(new Character( 'b')); fly.operation( "Second Call"); fly = factory.factory(new Character( 'a')); fly.operation( "3番目のコール"); }}クライアントは3つの犠牲オブジェクトを適用しましたが、実際に作成された犠牲オブジェクトは2つしかありません。これが共有の意味です。操作結果は次のとおりです。
複雑な楽しみモード
シンプルな楽しみモードでは、すべての楽しみオブジェクトはシンプルな楽しみオブジェクトです。つまり、直接共有できることを意味します。また、いくつかの単純な外因性使用合成モードを組み合わせて複合外部オブジェクトを形成するより複雑な状況もあります。このような複合メタエンジョイオブジェクトは、それ自体で共有することはできませんが、それらは単純なメタエンジョイオブジェクトに分解でき、後者を共有できます。
化合物Xiangyuanの文字に関与する文字は次のとおりです。
抽象的なフライ級の役割:すべての特定のフライ級ロールを実装する必要がある方法を指定するための抽象インターフェイスを提供します。
Concreteflyightの役割:抽象的なXiangyuanの役割によって指定されたインターフェイスを実装します。本質的な状態がある場合、本質的な状態にストレージスペースを提供する責任がなければなりません。
CompositeCompositeFlyightの役割:複合共有で表されるオブジェクトは共有できませんが、複合共有オブジェクトは、単に共有されるオブジェクトの複数の組み合わせに分解できます。複合外因性の役割は、非共有外因性オブジェクトとも呼ばれます。
FlyWeightFactoryの役割:この役割は、Xiangyuanの役割の作成と管理に責任があります。この役割は、システムによってFouncementオブジェクトを適切に共有できるようにする必要があります。クライアントオブジェクトがXiangyuanオブジェクトを呼び出すと、Xiangyuan Factoryの役割は、システム内の要件を満たすXiangyuanオブジェクトがすでにあるかどうかを確認します。すでに存在する場合、Xiangyuanの工場の役割は既存のXiangyuanオブジェクトを提供する必要があります。システムに適切なXiangyuanオブジェクトがない場合、Xiangyuan Factoryの役割は適切なXiangyuanオブジェクトを作成する必要があります。
ソースコード
抽象文字クラス
パブリックインターフェイスフライ級{//回路図メソッド、パラメーター状態は外部状態のパブリックボイド操作(String State);}です。特定の楽しみの役割クラス
パブリッククラスのconcreteflyightは、flyweight {private chargetle intrinsicstate = null; / ***コンストラクター、内因性状態はパラメーターとして渡されます* @param State*/ public Concreteflywight(Chargetwe State){this.intrinsicState = state; } /** *外部状態はメソッドのパラメーターとして渡され、メソッドの動作を変更しますが、オブジェクトの固有の状態は変更されません。 */ @Override public void operation(String state){// todo auto-enerated method stub.out.println( "intrinsic state =" + this.intrinsicstate); system.out.println( "extinsic state =" + state); }}複合外部オブジェクトは、配合を介した純粋な外因性オブジェクトで構成されているため、add()などの集約管理方法を提供します。複合メタオブジェクトには異なる集約要素があるため、これらの集合体要素は複合メタオブジェクトが作成された後に追加されます。これ自体は、複合メタオブジェクトの状態が変更されるため、複合メタオブジェクトを共有できないことを意味します。
化合物外因性の役割は、抽象的な外因性の役割、つまり操作()メソッドによって指定されたインターフェイスを実装します。この方法には、複合外のオブジェクトの外部状態を表すパラメーターがあります。複合娯楽オブジェクトのすべての要素の外部状態は、複合娯楽オブジェクトの外部状態に等しくなります。コンポジットの楽しさオブジェクトに含まれる単純な楽しみオブジェクトの内部状態は一般に等しくありませんが、それ以外の場合は使用値がありません。
パブリッククラスconcreteCompositeflyightはflyweight {private map <character、flyweight> files = new hashmap <character、flyweight>(); / ***クラスターに新しいシンプルなメタ節約オブジェクトを追加*/ public void add(Character Key、Flyweight Fly){files.put(key、fly); } / ***外部状態はパラメーターとしてメソッドに渡されます* / @Override public void operation(string state){flyweight fly = null; for(object o:files.keyset()){fly = files.get(o); fly.operation(状態); }}} Xiangyuan Factoryの役割は、2つの異なる方法を提供します。1つは単純なXiangyuanオブジェクトを提供し、もう1つは複合Xiangyuanオブジェクトを提供するためです。
Public Class FlyWeightFactory {Private Map <Character、Flyweight> files = new Hashmap <Character、Flyweight>(); / ***化合物xiangyuan工場メソッド*/ public flyweight Factory(list <character> compositestate){concreteCompositeflyight compositefly = new ConcreTeCompositeFlyight(); for(文字状態:compositestate){compositefly.add(state、this.factory(state)); } compositeflyを返します。 } /*** Simple Encyclopedia Factory Method* /public Flyweight Factory(Chargeted State){// Cache Flyweight Fly = files.get(state)のオブジェクトを最初に探します。 if(fly == null){//オブジェクトが存在しない場合、新しいフライ級オブジェクトを作成しますfly = new Concreteflyight(state); //この新しいフライ級オブジェクトをcache files.put(state、fly)に追加します。 }フライを返します。 }}クライアントの役割
public class client {public static void main(string [] args){list <character> compositestate = new ArrayList <Character>(); compositestate.add( 'a'); compositestate.add( 'b'); compositestate.add( 'c'); compositestate.add( 'a'); compositestate.add( 'b'); FlyWeightFactory FlyFactory = new FlyWeightFactory(); Flyweight CompositeFly1 = FlyFactory.Factory(compositestate); Flyweight CompositeFly2 = FlyFactory.Factory(compositestate); compositefly1.operation( "composite call"); System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ FlyFactory.Factory(State);操作結果は次のとおりです。
操作の結果から、複合楽しさオブジェクトのすべての要素の外部状態は、複合楽しさオブジェクトの外部状態に等しいことがわかります。つまり、外部の占い状態は複合呼び出しに等しくなります。
操作結果から、複合現存オブジェクトに含まれる単純な現存のオブジェクトの含意状態は一般に不平等であることがわかります。つまり、内部状態はb、c、およびaです。
実行中の結果から、複合共有オブジェクトを共有できないことがわかります。つまり、工場を2回介して同じオブジェクトを使用して作成して作成されたオブジェクトは、同じオブジェクトではありません。
操作結果から、単に要素を楽しむだけで共有できることがわかります。つまり、同じオブジェクト状態を使用して工場で2回作成されたオブジェクトは同じオブジェクトです。
Xiangyuanモデルの長所と短所
百科事典モードの利点は、メモリ内のオブジェクトの数を大幅に削減することです。ただし、これを行うために支払う価格も非常に高いです。
百科事典モードにより、システムがより複雑になります。オブジェクトを共有するためには、一部の状態を外部化する必要があり、プログラムのロジックを複雑にします。
Funy Modeは、Peny Objectの状態を外部化し、外部状態を読むと、実行時間がわずかに長くなります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。