我对设计模式有些陌生,这是我在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;
}
}发布于 2009-03-26 02:49:44
我不确定我是否理解了整个范围,但似乎您应该能够创建一些表示不同类型图的共享属性的对象,并将该对象公开为抽象创建者的属性,由具体创建者访问,甚至可以作为参数传递给各个xmlFactory构造器。调用方可以通过访问公开该对象的属性来直接在该对象上设置这些属性,并且具体的类可以从该对象中读取它们。然而,这确实意味着调用者需要经过更多级别的间接访问才能访问这些公共属性。
我不太明白你有什么重复的东西。你已经在抽象创建器上实现了属性,但你说你也“在工厂中复制这些属性”?你指的是具体的创造者吗?我不明白为什么--您指的是base.Caption,那么如果FusionGraphs都继承自GraphCreator,并且您正在使用它的基类实现,那么为什么还要在base中复制任何东西呢?
发布于 2009-03-25 15:00:25
我想你的问题是如何在调用工厂的类和工厂本身之间共享配置信息。实现一个单独的类来保存配置信息(例如标题),然后向工厂和创建者提供对它的引用。
https://stackoverflow.com/questions/681952
复制相似问题