1

以下の図は複雑なアルゴリズムの単純な部分です。 enter image description here アルゴリズムに従っていくつかのクラスを準備しようとしています。どのように制御/コーディネートされたアルゴリズム

abstract class Person 
{ 
    public string HasXRecords { get; set; } 
    public int PersonAnotherFeature { get; set; } 
    public List<X> Xs { get; set; } = new List<X>(); 
} 
abstract class X 
{ 
    //There will more than 1000 type subX classes 
} 

interface IAdder 
{ 
    void AddXToList(); 
} 

interface IRemover 
{ 
    void RemoveXFromList(); 
} 

class XAdderFactory 
{ 
    private Person _person; 
    public bool PersonHasNoRecords 
    { 
     get 
     { 
      return string.IsNullOrEmpty(_person.HasXRecords); 
     } 
    } 
    public XAdderFactory(Person person) 
    { 
     this._person = person; 
     if (PersonHasNoRecords) 
     { 
      new XListMakerAFactory(person); 
     } 
     else 
     { 
      new XListMakerB(person); 
     } 
    } 
} 

class XListMakerB: IAdder 
{ 
    private Person _person; 
    public XListMakerB(Person person) 
    { 
     this._person = person; 
     AddXToList(); 
     new PersonXListEvaluator(person); 
    } 
    public void AddXToList() 
    { 
     //Dynamic instance of X will be added in to person Xlist. 
    } 
} 

class XListMakerAFactory 
{ 
    public XListMakerAFactory(Person person) 
    { 
     switch (person.PersonAnotherFeature) 
     { 
      case 1:new XListMakerA1(person); 
       break; 
       //there will be XListMakerA2,XListMakerA3 etc. 
     } 
     new XRemoverFactory(person); 
    } 
} 
class XListMakerA1: IAdder 
{ 
    private Person _person; 
    public XListMakerA1(Person person) 
    { 
     this._person = person; 
     AddXToList(); 
     new PersonXListEvaluator(person); 
    } 
    public void AddXToList() 
    { 
     //_person.Xs.Add(new X1()); 
     // According to business logic,X2,X3 etc. will be added manually. 
    } 
} 

class XRemoverFactory 
{ 
    public XRemoverFactory(Person person) 
    { 
     new XRemoverFromList1(person); 
     new XRemoverFromList2(person); 
    } 
} 

class XRemoverFromList1 : IRemover 
{ 
    private Person _person; 
    public XRemoverFromList1(Person person) 
    { 
     this._person = person; 
     RemoveXFromList(); 
    } 
    public void RemoveXFromList() 
    { 
     //According some business logic some Xs will be removed. 
    } 
} 

class XRemoverFromList2 : IRemover 
{ 
    private Person _person; 
    public XRemoverFromList2(Person person) 
    { 
     this._person = person; 
     RemoveXFromList(); 
    } 
    public void RemoveXFromList() 
    { 
     //According some business logic some Xs will be removed. 
    } 
} 
class PersonXListEvaluator 
{ 
    public PersonXListEvaluator(Person person) 
    { 
     //According to business rules evaluation will be cordinated. 
    } 
} 

私の主な関心事は、その次のレベルの工場の後、そのレベルでインスタンス化する必要があります(同じレベルで)どのクラスを決定しますalgorithm.Iは、そのレベルのファクトリメソッドを設計しようと大成功しclassessの多くを管理することですメソッドはインスタンス化されています。フローは、レベルファクトリメソッドのコンストラクタで管理されます。これは管理しやすく、メインテーブルであると思いますか?

+0

これはhttp://codereview.stackexchange.com/のようです。 – jaco0646

+0

私はこのリンクを発見しましたhttps://msdn.microsoft.com/en-us/library/ff650706.aspx – Mehmet

答えて

1

生成に関するパターン:あなたはあなたの要件-type_list_aとtype_list_bごとに工場の2種類を返しAbstract_factory、として必要

行動パターン:

あなたは実行時に動的にアルゴリズムの交換を探しているなら、あなたがコンテキストStrategy_patternを使用する必要があります。

コンテキストは特定のアルゴリズムを認識して返します。そのため、クライアントはアルゴリズムを実装する100または1000クラスをすべて認識しません。

Real World Example of the Strategy Patternが良い例です。

構造パターン:

あなたはすべてのサブシステムを公開せずにクライアントに複雑さを非表示にする場合は、Facadeパターンを使用します。

各パターンの使用例の詳細は、sourcemakingチュートリアルをご覧ください。

+0

あなたの答えをありがとう。 – Mehmet

+0

もう一度ありがとう。私はファサードを見て、私はファサードが私が探しているものだと思う。 – Mehmet

+0

抽象的な工場のためのそのウィキペディアの記事に注意してください。これには、正しい情報と誤った情報が混在しています。特に、ファーストクラス図やC#とJavaの例は正しくありません。より良いリソースは、[sourcemaking](https://sourcemaking.com/design_patterns/abstract_factory)、[oodesign](http://www.oodesign.com/abstract-factory-pattern.html)、[spring guru]( https://springframework.guru/gang-of-four-design-patterns/abstract-factory-design-pattern/)。 Wikipediaは、非技術的作家によって編集されているため、デザインパターンを学習するための大きなリソースではありません。 – jaco0646

関連する問題