我对设计模式有些新意,这是我在stackoverflow中的第一篇文章,所以希望这个问题有意义。我已经创建了一个抽象工厂来处理为不同的图表供应商(dundas,flash等等)生成xml字符串。下面是我工厂的代码大纲(如果它有帮助,我可以包含更多。)我希望我的客户能够设置所有类型的图表(标题,动画等)中常见的属性所以客户端可以做这样的事情:
GraphCreator fusion = new FusionGraphs();
//set the props for the graph
fusion.Caption = "Fusion 2D Line Chart";
最好的方法是什么?现在,我在抽象创建器中设置属性,以便客户端可以访问它们,但我还必须在工厂中复制这些属性,以便在构建xml时可以访问它们。
//这是抽象工厂
public interface IXMLFactory
{
//add interface methods
IRoot makeRoot();
IRootAttrib makeRootAttrib();
INodes makeNodes();
INodeAttrib makeNodeAttrib();
}
//这是抽象创作者
public abstract class GraphCreator
{
public virtual Graph getGraph(Graph.Types graphType)
{
//abstract product
Graph graph;
//abstract product creation
graph = buildGraph(graphType);
graph.draw();
return graph;
}
public abstract Graph buildGraph(Graph.Types graphType);
}
//这是具体的创作者
public class FusionGraphs : GraphCreator
{
Graph g = null;
//XML parts for fusion 2D multi series
IXMLFactory xmlFactory;
//use xml parts that are needed for the type of fusion graph requested
public override Graph buildGraph(Graph.Types graphType)
{
switch (graphType)
{
case Graph.Types.Single2DLine:
xmlFactory = new Fusion2DSingleXMLFactory();
g = new Single2DLineGraph(xmlFactory);
xmlFactory.Caption = base.Caption;
break;
case Graph.Types.Single2DBar:
xmlFactory = new Fusion2DSingleXMLFactory();
g = new Single2DBarGraph(xmlFactory);
break;
}
return g;
}
}
答案 0 :(得分:1)
我不确定我是否理解了整个范围,但这似乎你应该能够创建一些表示不同类型图形的共享属性的对象,并将该对象公开为属性抽象创建者,可由具体创建者访问,甚至可以作为参数传递给各个xmlFactory构造函数。调用者可以通过访问公开它的属性直接在该对象上设置这些属性,具体类可以从该对象读取它们。但是,这确实意味着调用者会通过另一个间接级别来访问这些公共属性。
我不太明白你有什么重复。您在抽象创建者上实现了属性,但您说您还“在工厂中复制这些属性”?你指的是具体的创造者吗?我不明白为什么 - 你指的是base.Caption,那么为什么你需要在FusionGraphs中复制任何东西,如果它都是从GraphCreator继承的,你正在使用它的基类实现?
答案 1 :(得分:0)
我认为你的问题是如何在调用工厂的类和工厂本身之间共享配置信息。实现一个包含配置信息(例如标题)的单独类,然后向工厂和创建者提供对它的引用。