2

私のプロジェクトでは、4 つのレイヤー プレゼンテーション、BL、DL、およびデータ オブジェクトがあります。抽象ファクトリ パターンを実装して、必要なオブジェクト (医師/エンジニア) を取得したいと考えています。以下のコードはファクトリ パターンを実装していますか?

 public interface IProfessional //The Abstract Factory interface. 
{
    IProfession CreateObj();
}

// The Concrete Factory  class1.
public class DocFactory : IProfessional
{
    public IProfession CreateObj()
    {
        return new Doctor();
    }
}

// The Concrete Factory  class2.
public class EngFactory : IProfessional
{
    public IProfession CreateObj()
    {
        // IMPLEMENT YOUR LOGIC
        return new Engineer();
    }
}
// The Abstract Item class
public interface IProfession
{       
}

// The Item class.

public class Doctor : IProfession
{
  public int MedicalSpecialty
 {
  get; set; 
 }
  public int AreaofExpertise
 { 
  get; set; 
  }

}
// The Item class.
public class Engineer : IProfession
{
  public string Title{
     get;set;
}
  public int AreaofExpertise 
{ 
 get; set; 
}


}


// The Client class.
public class AssignProfession
{
    private IProfession _data;

    public AssignProfession(DataType dataType)
    {
        IProfessional factory;
        switch (dataType)
        {
            case DataType.Doc:
                factory = new EngFactory();
                _data = factory.CreateObj();//from here i will get engineer

                break;
            case DataType.Eng:
                factory = new DocFactory();
                _data = factory.CreateObj();//from here i will get doctor

                break;
        }
    }

    public IProfession GiveProfessional()
    {
        return _data;
    }
}

//The DataType enumeration.
public enum DataType
{
    Doc,
    Eng
}
4

2 に答える 2

1

あなたのコードはパターンを実装していますが、C# で可能な範囲までは実装されていません。つまり、C# 言語の重要な利点を利用していません。

これを改善する方法の例を次に示します。

 class Program
{
    static void Main(string[] args)
    {
        var myEngineer = ProfessionFactory.CreateProffession<Engineer>();
        var myDoctor = ProfessionFactory.CreateProffession<Doctor>();
        myEngineer.EnginerringStuff();
        myDoctor.HealingPeople();

        var myEngineer2 = (Engineer)ProfessionFactory.CreateProffession("Engineer");
        //using the other method I still have to cast in order to access Engineer methods.
        //therefore knowing what type to create is essential unless we don't care about engineer specific methods,
        //in that case we can do:
        var myEngineer3 = ProfessionFactory.CreateProffession("Engineer");
        //which is useless unless we start involving reflections which will have its own price..
    }

    public interface IProfessionFactory
    {
        IProfession CreateObj(); 
    }

    public interface IProfession : IProfessionFactory
    {
        string ProfessionName { get; }
    }

    public abstract class ProfessionFactory : IProfessionFactory
    {
        public abstract IProfession CreateObj();

        public static T CreateProffession<T>() where T:IProfessionFactory, new()
        {
            return (T)new T().CreateObj();
        }

        public static IProfession CreateProffession(object dataObj)
        {
            if (dataObj == "Engineer")
                return CreateProffession<Engineer>();
            if (dataObj == "Doctor")
                return CreateProffession<Doctor>();
            throw new Exception("Not Implemented!");
        }
    }

    public class Engineer : IProfession
    {
        public string ProfessionName
        {
            get { return "Engineer"; }
        }

        public IProfession CreateObj()
        {
            return new Engineer();
        }

        public void EnginerringStuff()
        {}
    }

    public class Doctor : IProfession
    {
        public string ProfessionName
        {
            get { return "Doctor"; }
        }

        public IProfession CreateObj()
        {
            return new Doctor();
        }

        public void HealingPeople()
        {}
    }
}
于 2012-05-17T06:15:03.363 に答える
0

パターンのすべての要素が含まれているように見えますが、IProfessionは空です。これは単なるプレースホルダーであると想定し、すべての職業に共通する動作を表すいくつかのメソッドを入力します。Allen Holubのにある例とは対照的に、 彼はCollectionをAbstractFactoryとして、Iteratorを抽象製品として、Treeをコンクリート工場として、そして反復子を具体的な製品として返すと述べています。

于 2012-05-22T15:01:16.003 に答える