2010-11-04 50 views
1

我有读取在它的各个用户设置的输入文件的应用程序。其中一些设置适用于在非常低级别实例化的非常特定的类。但输入文件被读取并且设置存储在应用程序的顶层。如何使用顶级应用程序中的实例化信息创建低级对象?

这儿什么时候实例化一个低级别类的设计模式(这是从顶层取下几个环节)如果您使用了在顶层读取信息?

回答

-1

通常拥有包含全局属性的单个全局应用程序对象,因此,低级别类可以从该单一点访问所需的所有内容。如果项目不是很复杂,这个解决方案是相当易于管理的。

作为一种变体,您可以使用全局应用程序对象实现接口,其中低级类感兴趣并在构建时注入它。像(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

非常有趣,非常感谢! – jjkparker 2010-11-08 14:55:57

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

相关问题