7

Java で flyweight オブジェクトを作成しようとしています。私はObjective-Cで同様の概念を扱ってきました(Objective-Cのシングルトンクラス//それらは同じものだと思います)。

flyweight オブジェクトを作成して使用する方法を学ぶためにオンラインでチュートリアル、例、または説明を見つけようとしていますが、Google で検索しましたが、降下するものは見つかりません。私は 10 ページを調べましたが、基本的にはすべて、概念を説明する 1 つの Web サイトから盗用しています。私は概念を理解しています - Java でそれを実装する方法を教えてくれる/教えてくれる何かが必要です。

誰にも提案/チュートリアルはありますか?

ありがとう!

4

5 に答える 5

3

flyweight パターンのウィキペディアのエントリには、具体的な Java の例があります。

編集して、OPがパターンを理解できるようにします。

As noted in my comment below, The point of the flyweight pattern is that you're sharing a single instance of something rather than creating new, identical objects.

Using the Wiki example, the CoffeeFlavorFactory will only create a single instance of any given CoffeeFlavor (this is done the first time a Flavor is requested). Subsequent requests for the same flavor return a reference to the original, single instance.

public static void main(String[] args) 
{
    flavorFactory = new CoffeeFlavorFactory();
    CoffeeFlavor a = flavorFactory.getCoffeeFlavor("espresso");
    CoffeeFlavor b = flavorFactory.getCoffeeFlavor("espresso");
    CoffeeFlavor c = flavorFactory.getCoffeeFlavor("espresso");

    // This is comparing the reference value, not the contents of the objects
    if (a == b && b == c)
        System.out.println("I have three references to the same object!");
}
于 2011-09-27T02:05:18.263 に答える
1

ブライアンが引用したウィキペディアの例をフォローアップするには...

通常、一部のオブジェクト(CoffeeFlavorsなど)をキャッシュして、それらを複数のフライウェイト(CoffeeOrders)間で共有する場合は、静的に使用できるようにします。しかし、これはまったく必要ありません。重要な部分は、CoffeeOrdersが構築されるときに共有オブジェクトが与えられることです。

「CoffeeOrderFactory」のように、注文が常に1つのシングルトンによってのみ作成される場合、ファクトリはフレーバーの非静的キャッシュを保持できます。どのように達成しても、目標は、システム全体のすべての注文で、まったく同じフレーバーオブジェクトのセットを使用できるようにすることです。しかし、結局のところ、CoffeeFlavorのインスタンスを多数作成することを避けたい場合は、キャッシュが1つしかないことを確認するために、通常は静的に作成する必要があります。

それを得る?

于 2011-09-27T03:00:16.963 に答える
1

私はこのケースを手に入れました。私の解決策はフライ級だったと思います。

入力

  • A:CE
  • B:DC
  • C:E
  • A:B

ツリーを作成し、その子を名前で並べ替えるように求められました。このようなもの:

  • A:BCE
  • B:CD
  • C:E

実は簡単な作業です。ただし、入力の最初の「A」と2番目の「A」は同じオブジェクトを参照する必要があることに注意してください。したがって、私はこのようなものをコーディングしました

public Node add(String key){
  Node node = nodes.get(key);
  if (null == node){
    node = new Node(key);
    nodes.put(key, node);
  }
  return node;
}

これは実際の問題を簡略化したものですが、今すぐに理解できるはずです。

于 2011-09-27T03:04:25.710 に答える
0

この例も見つけました。これには、優れたJavaコードの例があります。

于 2011-09-27T03:04:39.670 に答える
0

「java.lang.Character」はフライウェイト パターンを使用して、すべての US-ASCII 文字をキャッシュします。Character.valueOf ()メソッドで使用されるクラス java.lang.Character$CharacterCache を参照してください。

于 2014-01-09T10:14:27.863 に答える