我有一个应用程序,它读取包含各种用户设置的输入文件。其中一些设置适用于以非常低的级别实例化的非常特定的类。但是读取输入文件并将设置存储在应用程序的顶层。
这里的设计模式是什么,用于使用在顶层读取的信息来实例化一个低级别类(从顶层删除了几个链接)?
答案 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);
}
}
仅向对象传递所需的最少信息。因此,如果需要,您可以保持具体的“主力”类(文件)简单且松散耦合,并在以后处理参数传递。