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 그 다음 단계 공장 한 후 그 수준에서 인스턴스화되어야합니다 (같은 수준에서) 어떤 클래스를 결정합니다 수준의 팩토리 메소드를 설계하려고 SUCCES하는 수업을 통해 많이 관리하는 것입니다 메소드는 인스턴스화됩니다. 플로우는 레벨 팩토리 메소드의 생성자에서 관리됩니다. 이것이 관리 가능하고 메인 테이블이라고 생각하십니까? 더 나은 솔루션을 제공합니까?

+0

http://codereview.stackexchange.com/ 질문입니다. – jaco0646

+0

이 링크를 발견했습니다. https://msdn.microsoft.com/en-us/library/ff650706.aspx – Mehmet

답변

1

창조적 패턴 : 당신은 당신의 요구 사항 -type_list_a 및 type_list_b에 따라 공장의 두 가지 유형을 반환 Abstract_factory으로 필요

.

행동 패턴

동적 런타임에 알고리즘의 교환을 찾고 있다면, 당신은 상황으로 Strategy_pattern을 사용해야합니다.

은 특정 알고리즘을 인식하고 반환하므로 클라이언트는 알고리즘을 구현하는 모든 100 또는 1000 클래스를 알 수 없습니다.

Real World Example of the Strategy Pattern이 좋은 예이다.

구조 패턴

당신은 모든 하위 시스템을 노출시키지 않고 클라이언트에 복잡성을 숨길 Facade 패턴을 사용하려면.

각 패턴의 사용 사례에 대한 자세한 내용은 sourcemaking 튜토리얼을보십시오.

+0

답변 해 주셔서 감사합니다. – Mehmet

+0

다시 한번 감사드립니다. 외관을 보았습니다. 외관은 내가 찾고있는 외관이라고 생각합니다. – Mehmet

+0

초록 공장에 대한 위키피디아 기사에주의하십시오. 정확한 정보와 부정확 한 정보가 혼합되어 있습니다. 특히, C# 및 Java 예제뿐 아니라 1 급 다이어그램도 올바르지 않습니다. 더 나은 자원은 다음과 같습니다. [소스 제작] (https://sourcemaking.com/design_patterns/abstract_factory), [oodesign] (http://www.oodesign.com/abstract-factory-pattern.html) 및 [스프링 전문가] (https://springframework.guru/gang-of-four-design-patterns/abstract-factory-design-pattern/). Wikipedia는 비 기술 작가가 편집하기 때문에 디자인 패턴을 학습하는 데 유용한 리소스가 아닙니다. – jaco0646