我有读取在它的各个用户设置的输入文件的应用程序。其中一些设置适用于在非常低级别实例化的非常特定的类。但输入文件被读取并且设置存储在应用程序的顶层。如何使用顶级应用程序中的实例化信息创建低级对象?
这儿什么时候实例化一个低级别类的设计模式(这是从顶层取下几个环节)如果您使用了在顶层读取信息?
我有读取在它的各个用户设置的输入文件的应用程序。其中一些设置适用于在非常低级别实例化的非常特定的类。但输入文件被读取并且设置存储在应用程序的顶层。如何使用顶级应用程序中的实例化信息创建低级对象?
这儿什么时候实例化一个低级别类的设计模式(这是从顶层取下几个环节)如果您使用了在顶层读取信息?
通常拥有包含全局属性的单个全局应用程序对象,因此,低级别类可以从该单一点访问所需的所有内容。如果项目不是很复杂,这个解决方案是相当易于管理的。
作为一种变体,您可以使用全局应用程序对象实现接口,其中低级类感兴趣并在构建时注入它。像(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);
}
}
传递给对象只需要它的最小信息。所以你可以保持你的具体的“主力”类(文件)简单和松散耦合,并在需要时处理参数传递。
有顶层只处理抽象,并使用你的平台的反射库实例化的具体类型。
工厂类/提供程序可能很有用,您可以在其中传递一组可用于构造具体类型的属性。
全部放在一起,它可能看起来像这样在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
。
非常有趣,非常感谢! – jjkparker 2010-11-08 14:55:57