jeudi 6 février 2020

How to handle same code parts in Factory Method?

I have some classes:

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;}
}

And trying to create Factory Method pattern for this:

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;
    }
}

Here are the classes what contain information to create 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; }
}

And Usage:

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);
}

Full code fiddle.

My problem is how to handle code duplication. I mean there is a lot of lines that fills base House object properties. How can I write that code only once?
Or I should not to use Factory Method?

Aucun commentaire:

Enregistrer un commentaire