2009-05-27 6 views
5

[OK]をクリックすると、質問が明瞭でない場合があります。どのようにして、コンストラクタをファクトリクラスのみで使用できるようにしますか?

私は靴(CShoe)オブジェクトファクトリクラスがCFactoryであるとしましょう。 CFactoryは、単純なハッシュマップを使用してインスタンス化されたすべての靴を作成して格納するシングルトンクラスです。作成されたオブジェクトを使用するには、静的メソッドを使用してアクセスします。

工場でのみ呼び出すことができるようにCShoeのコンストラクタを強制する方法はありますか? (換言すれば、靴の作成は靴工場のシングルトンクラスでのみ可能であり、他のクラスではできないようにしてください)

答えて

5

あなたはShoeFactoryShoeinner classを作ることができる:

public class SmellyShoe { 

    public static void main(String[] args) { 
     try { 
      java.lang.reflect.Constructor c = Shoe.class.getDeclaredConstructors()[0]; 
      c.setAccessible(true); 
      Shoe smelly = (Shoe)c.newInstance(null); 
      // grr 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

製品を工場の入れ子にしたクラスにしたいですか? –

+0

あなたはCShoeを内部クラス(静的クラスではない)にすることもできます。そうすることで、他の人がCFactoryのインスタンスを持たずにCShoeのインスタンスを作成できないようにすることもできます。 – Chii

+0

例が実行可能ならば、リフレクションは常にsetAccessible()メソッドでアクセス制御修飾子を回避できます。これを停止するには、 "suppressAccessChecks"パーミッションを許可しないSecurityManagerを実行してください.http://java.sun.com/docs/books/tutorial/essential/environment/security.html –

4

CShoeコンストラクタパッケージにアクセスして、CShoeとCFactoryの両方を同じパッケージ。

1

マップに各オブジェクトを追加したいので、このロジックをCShoeコンストラクタに移動することもできます。オブジェクトはそれ自身を追加します。

0

おそらく、ファクトリオブジェクトをコンストラクタに渡すことができますか?

public CShoe(CFactory factory) 
{ 
    if (factory == null || 
      !factory.isValid()) // or whatever 
    { 
     throw new IllegalArgumentException(); 
    } 
} 
0

Couldn」:

public class ShoeFactory { 

    public static class Shoe { 
     private String name; 

     private Shoe() { 
     } 

     private Shoe(String name) { 
      this.name = name; 
     } 
    } 

    public static Shoe createShoe(String shoeName) { 
     return new Shoe(shoeName); 
    } 
} 

私は.... 反射除いて、このほとんどカバーにすべてのケースを考えますあなたは靴の静的メンバの引数として呼び出し側のインスタンスを渡すだけで、そこには "isInst anceOf "がtrueの場合はコンストラクタを呼び出します。

1

最初に、作成したすべてのインスタンスを保持すると、そのインスタンスはリークと呼ばれます。非強参照、有界またはそのようなキャッシュを意味すると仮定し、Shoeは不変です。

staticメソッドを使用して工場に返すだけです。

public final class Shoe implements Footwear { 
    private static final FootwearFactory<Shoe,Something> FACTORY = 
     new FootwearFactory<Shoe,Something>() { 
      ... 
      public Shoe get(Something value) { 
       value = new Something(value); 
       ... 
       return new Show(value); 
      } 
     }; 
    private static FootwearFactory<Shoe,Something> getFactory() { 
     return FACTORY; 
    } 

    private final Something value; 
    private Shoe(Something value) { 
     this.value = value; 
    } 
    ... 
} 
+0

Hummm、工場の仕組み。私はこの時間すべて間違っていた...だから、工場は製品に属している必要があります...素敵な!!! –

+0

"Belong"は強い言葉です。しかし、コンストラクタはそのクラスの一部です。したがって、 "仮想コンストラクタ"も単純なケースがあるはずです。 –

関連する問題