0

私はファクトリークラスを作成しましたが、それを実装するより良い方法はどれでしょうか。オプション1

public class Factory {

    private IProperty prop;
    public IDoc doc;

    public Factory(int version) {
        switch (version) {
            case '1':   
                prop = new Prop();
                doc = new Docu();
        ...
            case '2':
            prop = new Prop1();
            doc = new Docu1();
        ...
        }
    }

    public IProperty getProperty() {
        return this.prop;
    }

    public IDoc getDoc() {
        return this.doc;
    }
}

私の質問は、そのようにするかどうか、つまり、インターフェイス型でメンバーを定義し、コンストラクターをオンにするか、すべての get メソッドでコンストラクターの代わりに switch ステートメントを使用するかどうかです。したがって、コンストラクターでは、バージョンを取得して保存しますクラスメンバーで、たとえば次のように使用するよりも

public IProperty getProperty() {
switch (version) {
  case '1':
    prop = new Prop();
  case '2':
    prop = new Prop1();
...

では、より良い方法、または他のアイデアは何ですか?

4

5 に答える 5

5

最もクリーンな方法は、共有するものがあれば共通の抽象ベースまたは再利用可能なポリシー引数を与える 2 つの別個のファクトリとして行うことを公開することです。1 つのファクトリ タイプは、1 つのタイプの特定のオブジェクト (プラスチック ツールのみなど) のみを作成する必要があります。ファクトリ パブリック構成は通常、オブジェクトの作成に必要なプロパティ (サプライヤーの連絡先、特許) または作成されるオブジェクトの静的プロパティ (プラスチックの種類など) のみを保持しますが、オブジェクトの種類/クラスは保持しません。

また、例#1のような長寿命のオブジェクトのストレージは、おそらく「ファクトリー」ではなく「コンテキスト」と呼ばれるべきです。

以下のコード例。

public interface IFactory {
  IDoc createDoc();
  IProp createProp();
}

public class Type1Factory implements IFactory {
  @Override public IDoc createDoc() { return new Doc1(); }
  @Override public IProp createProp() { return new Prop1(); }
}
于 2012-11-15T07:45:33.377 に答える
0

それはあなたの状況によって異なります。

IProperty最初のオプションは、とIDocが異なるバージョンを持っていることを示唆していますが、一方のバージョンごとに対応する他方のバージョンを持っています。

2番目のオプションは、それらのバージョンが互いに独立している可能性があることを示唆しています。

于 2012-11-15T07:33:05.333 に答える
0

get*メソッドのすべての呼び出し元がオブジェクトの新しいインスタンスを受け取るため、2 番目の方法は常に優れています。コンストラクターで 2 つのオブジェクトを作成する場合、オブジェクト共有の問題を処理する必要があります (これらのオブジェクトを異なるスレッドで使用する場合はさらに問題が発生します)。

于 2012-11-15T07:25:52.270 に答える
0

ファクトリを作成するというアイデアは、最初のバージョンの方が 2 番目のバージョンよりもはるかに優れています。

理想的には、ファクトリ クラスのコンストラクタではなく、静的メソッドであるべきです。

public class Factory 
{
    public static IProperty getPropertyObject(char version)
    {
        switch (version)
        {
            case '1':
               return new Prop();

            case '2'
               return new Prop1();
        }
    }

    public static IDoc getDocObject(char version)
    {
        switch (version)
        {
            case '1':
               return new Doc();

            case '2'
               return new Doc1();
        }
    }
}
于 2012-11-15T07:26:07.890 に答える
0
  • まず第一に、Factory理想的には1つではstatic references なく持っているべきnon-staticです。そして 、適切なインスタンスstatic method作成/取得する必要があります。

  • 第 2 に、異なるタイプに対して2 つの異なるファクトリを用意することをお勧めします。

  • 第三に、私はあなたのメソッドにcreatePropertyではなく と名前を付けますgetPropertyObject。なぜなら、そのメソッドは作成中のインスタンスではなく、既に作成されたインスタンスを返さないからです。

もちろん、永続ストレージからそのバージョンgetPropertyObject('1')の を取得しているように見えますが、それは行っていることではありません。propertyむしろ、バージョンに基づいてインスタンスを作成しています。

(注: -の名前は重要です。これらはstatic factory methods利点の 1 つですconstructorsnamefactory method

そうは言っても、2nd optionこれらすべての変更により、より良いものになると思います。createPropertyを作成する方法をメソッドに決定させますinstance

だから、私はこのようにあなたのコードを変更します: -

public class PropertyFactory {
    private static IProperty prop;

    public static createProperty(char version) {

        switch (version) {
            case '1':
                prop = new Prop();
                break;  // Don't forget a `break` here.
            case '2':
               prop = new Prop1();
               break;

            default:  // do have a default case
               prop = null;
        } 
        return prop;
    }
}

同様に、 を作成してDocumentFactoryを作成できますdocument object。メソッドに名前を付ける: -createDocument(char version)

于 2012-11-15T07:36:30.687 に答える