Как вы создаете низкоуровневые объекты, используя информацию об экземплярах из приложения верхнего уровня? - PullRequest
1 голос
/ 04 ноября 2010

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

Какой здесь шаблон проектирования для создания экземпляра низкоуровневого класса (это несколько ссылок, удаленных с верхнего уровня) с использованием информации, читаемой на верхнем уровне?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2010

Обычно существует один глобальный объект App, который содержит глобальные свойства, поэтому низкоуровневые классы могут получить доступ ко всему, что им нужно из этой единственной точки. Если проект не очень сложный, это решение вполне управляемо.

В качестве варианта у вас может быть глобальный объект приложения, реализующий интерфейсы, в которых низкоуровневые классы заинтересованы и внедряют его во время построения. Нравится (C #):

interface ITextFileProperties
{
   string Encoding;
}

interface IGraphicsFileProperties
{
   int Resolution;
}

interface IFileProperties : ITextFileProperties, IGraphicsFileProperties
{
}

static class App : IFileProperties
{
  public string Encoding = "UTF-8"; // ITextFileProperties

  public int Resolution = 1024; // IGraphicsFileProperties
}

class TextFile
{
  public TextFile(ITextFileProperties data)
  {
    _globalEncoding = data.Encoding;
  }
}

class GraphicsFile
{
  IGraphicsFileProperties properties;

  public GraphicsFile(IGraphicsFileProperties data)
  {
    properties = data; // in case we'll need it later, if it can change at run time, etc.
  }
}

class SomeObjectUsingFiles
{
   public SomeObjectUsingFiles(IFileProperties properties)
   {
     _globalProperties = properties;
   }

   public void ProcessText()
   {
     var textFile = new TextFile(_globalProperties);
   }

   public void ProcessGraphics()
   {
     var grFile = new GraphicsFile(_globalProperties);
   }
}

Передать объекту только минимальную информацию, в которой он нуждается. Таким образом, вы можете сохранить ваши конкретные «рабочие лошадки» (файлы) простыми и слабо связанными, а затем, при необходимости, иметь дело с передачей параметров.

0 голосов
/ 04 ноября 2010

Пусть верхний уровень имеет дело только с абстракциями, и используйте библиотеку отражений вашей платформы для создания экземпляров конкретных типов.

Фабричный класс / поставщик может быть полезен, когда вы можете передать ему набор свойств, которые он может использовать для создания конкретного типа.

Собрав все это вместе, на Java это может выглядеть так:

interface Factory<T> {
    public T create(Properties p);
}

class MyObjFactory implements Factory<MyObj> {
    public MyObj create(Properties p) {
        return new MyObj(p.get("name"));
    }
}

class MyObj {
    private String name;
    public MyObj(name) {
        this.name = name;
    }
}

Тогда MyObjFactory будет построен отражательно и может быть использован для построения MyObj.

...