actionscript中的Factory方法实现

时间:2011-04-09 07:08:57

标签: flex actionscript-3 design-patterns flex4 factory-pattern

嘿伙计们,我在实现Factory方法时遇到了这个问题。 以下是主图表类的片段,它调用ChartFactory的方法来获得正确的对象。我键入Cast chartobject以便能够调用Show方法;我也对此感到担忧。

        container = new VBox();
        container.percentWidth = 100;
        container.percentHeight = 100;
        super.media.addChild(container);

        chartObject = new ChartBase();
        chartObject = ChartFactory.CreateChartObject(chartType);
        IChart(chartObject).Show(o);
        container.addChild(chartObject);

        legend = new Legend();
        legend.dataProvider = IChart(chartObject);
        container.addChild(legend);

以下是ChartFactory方法的片段:

public static function CreateChartObject(subType:String):ChartBase
    {
         switch(subType)
         {
             case ChartFactory.AREA_CHART:
                 return new AreaCharts();
                 break;

             case ChartFactory.COLUMN_CHART:
                 return new ColumnCharts();
                 break;

             case ChartFactory.PIE_CHART:
                 return new PieCharts();
                 break;

             default:
                 throw new ArgumentError(subType + ": Chart type is not recognized.");
         }
    }

以下是几个Charts类型类之一的Show方法:AreaCharts,PieCharts等。所有这些类都实现了IChart接口。

public function Show(o:ObjectProxy):void
    {
        var grids:GridLines;
        var stroke:SolidColorStroke;
        var horizontalAxis:CategoryAxis;
        var verticalAxis:LinearAxis;
        var horizontalAxisRenderer:AxisRenderer;
        var verticalAxisRenderer:AxisRenderer;

        grids = new GridLines();

        if(WidgetStylesheet.instance.LineChart_ShowGrid)
            grids.setStyle("gridDirection", "both");
        else
            grids.setStyle("gridDirection", "");

        stroke = new SolidColorStroke(WidgetStylesheet.instance.LineChart_GridLineColor, WidgetStylesheet.instance.LineChart_GridLineThickness);
        grids.setStyle("horizontalStroke", stroke);
        grids.setStyle("verticalStroke", stroke);

        horizontalAxis = new CategoryAxis();
        horizontalAxis.categoryField = o.LargeUrl.Chart.xField;
        horizontalAxis.title = o.LargeUrl.Chart.xAxisTitle.toString();
        verticalAxis = new LinearAxis();
        verticalAxis.title = o.LargeUrl.Chart.yAxisTitle.toString();

        horizontalAxisRenderer = new AxisRenderer();
        horizontalAxisRenderer.axis = horizontalAxis;
        horizontalAxisRenderer.setStyle("tickLength", 0);
        horizontalAxisRenderer.setStyle("showLine", false);
        horizontalAxisRenderer.setStyle("showLabels", true);
        horizontalAxisRenderer.setStyle("fontSize", WidgetStylesheet.instance.ComputeChartAxisFontSize(o.HeadlineFontSize));
        verticalAxisRenderer = new AxisRenderer();
        verticalAxisRenderer.axis = verticalAxis;
        verticalAxisRenderer.setStyle("tickLength", 0);
        verticalAxisRenderer.setStyle("showLine", false);
        verticalAxisRenderer.setStyle("fontSize", WidgetStylesheet.instance.ComputeChartAxisFontSize(o.HeadlineFontSize));

        this.series = this.m_createSeries(o);
        this.horizontalAxis = horizontalAxis;
        this.horizontalAxisRenderers = [horizontalAxisRenderer];
        this.verticalAxis = verticalAxis;
        this.verticalAxisRenderers = [verticalAxisRenderer];
        this.backgroundElements = [grids];
    }

3 个答案:

答案 0 :(得分:1)

我担心此代码存在多个问题。不幸的是,为什么你的图表没有出现是不明显的,所以你可以在下面应用一些建议并使用调试器来分析问题。

  1. 如果要在下一行中更改ChartBase引用的值,则创建chartObject实例没有意义

    chartObject = new ChartBase();
    chartObject = ChartFactory.CreateChartObject(chartType);
    
  2. 如果您的图表的API为IChart,则您的工厂应返回IChart而不是投放。

    public static function CreateChartObject(subType:String):IChart
    
  3. 确保从工厂返回正确类的实例。即您要返回标准PieChart的子类。通常,扩展类保持相同的名称并只更改包不是最好的主意。

  4. 如果您不确定程序是否输入了某些功能,请再次使用Flash Builder调试程序进行检查。没有调试器,我无法想象开发。

答案 1 :(得分:0)

一些想法:

  • 你调用Show方法,传递一些对象,但在该方法中没有任何地方添加到displayObject。 Show究竟应该做什么?

  • 您的类中的许多成员变量都以UpperCase开头。如果类的名称相同,编译器可以很容易地将这些与类名混淆。使用大写字母启动变量和函数名称的不良做法。

  • 如果将实例转换为另一个类或接口失败,则会出现运行时错误。使用Flash Builder调试器很容易调试它们。

答案 2 :(得分:0)

嘿ppl .. 我发现了wat wnt wrng..as olwys it wa“I”。 我有一个习惯,就是将mkin模拟器从主项目中隐藏起来并整合它。所以在模拟中,我使用了一个xml,而且在主项目中使用了一个稍微不同的格式。 我有一个条件chk从prog返回如果某个值不匹配,n由于错误的xml我没有。 所以这更像是一个词汇错误,而不是一个逻辑错误。 抱歉n Thanx evryone回复。