Как применить фабричный метод в данном случае?

Рейтинг: 2Ответов: 2Опубликовано: 09.02.2023

У меня есть два метода:

public interface IReader
{
    public Task<UserSettings> Read();
}

public interface IWriter
{
    public SettingState Write(ISetting setting, long id);
}

public class SettingWriter : IWriter
{
    public SettingState Write(ISetting setting, long id)
    {
       //do something
    }
}

public class SettingReader : IReader
{
    public  Task<UserSettings> Read()
    {
        //do something
    }
}

Эти методы считываю настройки из БД или записывают. Я хочу их обьединить в фабрику методов.

public abstract class SettingFactory
{

    public abstract IWriter Write();
     

    public abstract IReader Read();

}

Так же у меня есть три наследника класса ISetting, который в зависимости от типа будут создать свой экземпляр методов Reader и Writer.

public class SettingNotebook: SettingFactory
{
    public override IWriter Write()
    {
        //do something
    }

    public override IReader Read()
    {
         //do something
    }
}

Но есть нюанс - Writer одинаковый функционал для всех, а Reader - нет. Как правильно это можно сделать, чтобы Writer не копировать в реализации фабрики каждый раз, а Reader переопределять?

Ответы

▲ 0Принят

Как вариант можно реализовать метод Write() в родительский класс SettingFactory:

public abstract class SettingFactory
{
  public IWriter Write()
  {
    // do something
  }
  
  public abstract IReader Read();
}

А потом отдельно на каждый наследуемый класс указать Read():

public class SettingNotebook: SettingFactory
{
  public override IReader Read()
  {
    //do something
  }
}

public class Setting2: SettingFactory
{
  public override IReader Read()
  {
    //do something
  }
}

public class Setting3: SettingFactory
{
  public override IReader Read()
  {
    //do something
  }
}
▲ 0

Я бы создал базовый класс BaseSettingFactory:SettingFactory и в нем определил реализацию Writer. Соответственно, все SettingNotebook и подобные наследовались бы от BaseSettingFactory.