Как обрабатывать те же части кода в Factory Method? - PullRequest
1 голос
/ 06 февраля 2020

Я разместил вопрос на codereview , но не могу удалить этот вопрос, потому что уже отвечаю здесь.
У меня есть несколько классов:

public abstract class House 
{
   public string Name { set; get;}
   public SomeClass Property1 { set; get;}
   public OtherClass Property2 { set; get;}
}

public class WoodenHouse:House 
{
   public string WoodType { set; get;}
   public int WoodAge { set; get;}
}

public class StoneHouse:House 
{
  public string StoneType { set; get;}
}

И я пытаюсь создать шаблон Factory Method для этого:

abstract class Creator
{
    public abstract HouseInfo Info { get; set; }

    public Creator()
    {
    }

    public abstract House FactoryMethod();
}

class WoodenHouseCreator : Creator
{
    public override HouseInfo Info { get; set; }

    public WoodenHouseCreator(WoodenHouseInfo info)
    {
        Info = info;
    }

    public override House FactoryMethod()
    {
        var info = Info as WoodenHouseInfo;

        var woodenHouse = new WoodenHouse();
        woodenHouse.Name = info.Name;
        woodenHouse.Floors = info.Floors;
        woodenHouse.RoofType = info.RoofType;
        woodenHouse.WoodType = info.WoodType;
        woodenHouse.WoodAge = info.WoodAge;
        return woodenHouse;
    }
}

class StoneHouseCreator : Creator
{
    public override HouseInfo Info { get; set; }

    public StoneHouseCreator(StoneHouseInfo info)
    {
        Info = info;
    }

    public override House FactoryMethod()
    {
        var info = Info as StoneHouseInfo;

        var stoneHouse = new StoneHouse();
        stoneHouse.Name = info.Name;
        stoneHouse.Floors = info.Floors;
        stoneHouse.RoofType = info.RoofType;
        stoneHouse.StoneType = info.StoneType;
        return stoneHouse;
    }
}

Вот классы, которые содержат информацию для создания ahouse:

class HouseInfo
{
    public string Name { set; get; }
    public int Floors { set; get; }
    public string RoofType { set; get; }
}

class WoodenHouseInfo : HouseInfo
{
    public string WoodType { set; get; }
    public int WoodAge { set; get; }
}

class StoneHouseInfo : HouseInfo
{
    public string StoneType { set; get; }
}

И Использование:

var houseInfo = new WoodenHouseInfo
{
    Name = "HouseName",
    Floors = 2,
    RoofType = "Triangle",
    WoodType = "Pine",
    WoodAge = 100
};

House house;

if(houseInfo is WoodenHouseInfo)
{
    var creator = new WoodenHouseCreator(houseInfo);
    house = creator.FactoryMethod();
    Console.Write((house as WoodenHouse).WoodAge);
}

Полный код скрипка .

Моя проблема в том, как справиться с дублированием кода. Я имею в виду, что есть много строк, которые заполняют базовые House свойства объекта. Как я могу написать этот код только один раз?
Или я не должен использовать Factory Method?

1 Ответ

0 голосов
/ 06 февраля 2020

В настоящее время ваши фабрики создают новые объекты и затем заполняют все их свойства правильными значениями. Вы можете разделить создание экземпляров из присвоения значений свойств. Ваш StoneHouseCreator может создать экземпляр StoneHouse, использовать HousePopulator, который заполняет значения, общие для всех объектов типа House, а затем StoneHouseCreator может заполнить остальные значения, которые являются исключительными для StoneHouse. Тот же HousePopulator может также использоваться вашим WoodenHouseCreator, который затем будет заполнять свойства WoodenHouse -specifi c.

Если вы хотите философствовать об этом на более высоком уровне, это проблемы, с которыми мы сталкиваемся из-за наследования . Фабрики, то есть логическое отделение использования объекта от создания объекта, более естественно подходят для случаев, когда вы используете состав над наследование . Если вы заинтересованы в этом, я бы порекомендовал прочитать эту превосходную статью на топи c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...