Абстрактная фабрика шаблон и свойства - PullRequest
3 голосов
/ 25 марта 2009

Я немного новичок в разработке шаблонов, и это мой первый пост в stackoverflow, так что, надеюсь, этот вопрос будет иметь смысл. Я создал абстрактную фабрику для обработки строк XML для разных поставщиков диаграмм (dundas, flash и т. Д.). Ниже приведена схема кода моей фабрики (я могу добавить больше, если это поможет.) Мне бы хотелось, чтобы мой клиент мог устанавливать свойства, которые будут общими для всех типов диаграмм (заголовок, анимация и т. Д.), Чтобы клиент мог сделать что-то вроде этого:

        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;
    }


}

Ответы [ 2 ]

1 голос
/ 26 марта 2009

Я не уверен, понимаю ли я весь объем этого, но похоже, что вы должны быть в состоянии создать некоторый объект, который представляет общие свойства различных типов графиков, и выставить этот объект как свойство создателя абстрактных данных, доступных конкретным создателям и, возможно, даже переданных в качестве параметра отдельным конструкторам xmlFactory. Вызывающая сторона может устанавливать эти свойства непосредственно для этого объекта, получая доступ к свойству, которое его предоставляет, и конкретные классы могут читать их из этого объекта. Это, однако, означает, что вызывающая сторона проходит еще один уровень косвенного доступа для доступа к этим общим свойствам.

Я не совсем понимаю, какое у вас дублирование. У вас есть свойства, реализованные на абстрактном создателе, но вы сказали, что также «дублируете эти свойства на фабрике»? Вы имеете в виду конкретного создателя? Я не понимаю, почему - вы имеете в виду base.Caption, так зачем вам что-то дублировать в FusionGraphs, если все это унаследовано от GraphCreator, и вы используете его реализацию базового класса?

0 голосов
/ 25 марта 2009

Я думаю, что ваша проблема в том, как разделить информацию о конфигурации между классом, который вызывает фабрику, и самой фабрикой. Реализуйте отдельный класс, который содержит информацию о конфигурации (например, заголовок), а затем дайте ссылку на него как фабрике, так и создателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...