构造函数的设计模式

时间:2011-02-09 21:25:30

标签: java design-patterns constructor

我受到设计问题的挑战,我将在下面尝试描述。

假设一个类(称为A)具有带有一堆参数的构造函数。因为在每个实例化中编写所有这些参数都很累,所以我编写了另一个类,称之为StyleSheetA,它封装了所有这些参数,并且是A构造函数的唯一参数。这样,​​我可以准备一些默认值StyleSheetA模板稍后将使用,如果需要,我可以修改它们。

此时,我需要扩展A.假设B扩展A. B将拥有自己的样式表,即StyleSheetB。我认为StyleSheetB扩展StyleSheetA是合适的,所以使用一个样式表参数,B的构造函数也可以构造它的超类A.但我担心这个设计可能有缺陷的可能性。例如,如果我决定为样式表添加getter / setter,该怎么办?是否有一种新颖的方式来处理所有这些情况?我错了吗?对于那些困惑的人,我在这里附上一些代码:


    class A
    {
        StyleSheetA ss;

        A(StyleSheetA ss)
        {
            this.ss = ss;
            // Do some stuff with ingredients of styleSheet
        }
    }
    class StyleSheetA
    {
        int n1;
        int n2;
        // :
        // :
        int n100;
    }

    class B extends A
    {
        B(StyleSheetB ss)
        {
            super(ss);
            // Do some stuff with ingredients of styleSheet
        }
    }
    class StyleSheetB extends StyleSheetA
    {
        int n101;
        int n102;
        // :
        // :
        int n200;
    }

感谢您提供任何帮助或建议,也欢迎任何评论家。

编辑:我正在使用java开发,因此没有泛型支持。

3 个答案:

答案 0 :(得分:5)

在我看来,你只是在解决从A课到StyleSheetA课的参数过多的问题。

为了说明我的观点,请想一想这个问题:你如何实例化StyleSheetA?无论如何,可能使用接受所有这些参数的构造函数。此设计可能给您带来的唯一好处是,如果您有StyleSheetA对象封装的同一组参数值,您将在A的多个实例中重复使用这些参数值。如果是这样,请记住,尽管您有A的不同实例,但它们会共享相同的参数,因此它不是一个好的选择。

我可以向您推荐的是尝试重构您的课程A本身。尝试将其分解为更小的类。如果是nesseccary,请尝试创建子类以避免条件分支等。

现在,我不知道你的班级A是什么样的,但是如果你这样做,你将会有几个类,每个类都有自己的一组参数。如果任何参数是一个鉴别器(意味着它确定了类“类型”),你将能够摆脱它,只需使用子类,并依靠内置类型系统来代替它。

答案 1 :(得分:3)

您是否考虑使用IoC容器(如StructureMap)来管理构造函数依赖项?这可能会使这些东西变得更容易。

答案 2 :(得分:2)

关于getter和setter问题的想法:

'B'中的构造函数意味着附加参数(n101 +)对于类的操作是必需的。如果您只是使用完整参数列表扩展该类,那么B中的n101 ... n200和A中的n1 ... n100将具有getter和setter。这表明可能没有StylesheetB扩展StylesheetA,而是让B类的构造函数为B(StyleSheetA,StyleSheetB),这样你就可以在类A中为它的参数设置一个setter,继承了这个内容,并在B StylesheetB中添加了{{1}}。