如何使用顶级应用程序中的实例化信息创建低级对象?

时间:2010-11-04 17:53:08

标签: design-patterns

我有一个应用程序,它读取包含各种用户设置的输入文件。其中一些设置适用于以非常低的级别实例化的非常特定的类。但是读取输入文件并将设置存储在应用程序的顶层。

这里的设计模式是什么,用于使用在顶层读取的信息来实例化一个低级别类(从顶层删除了几个链接)?

2 个答案:

答案 0 :(得分:0)

让顶层只处理抽象,并使用平台的反射库来实例化具体类型。

工厂类/提供程序可能很有用,您可以在其中传递一组可用于构造具体类型的属性。

总而言之,它可能在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

答案 1 :(得分:-1)

习惯上有一个包含全局属性的单个全局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);
   }
}

仅向对象传递所需的最少信息。因此,如果需要,您可以保持具体的“主力”类(文件)简单且松散耦合,并在以后处理参数传递。