特征向量构建器 - 哪种设计模式有用?

时间:2012-11-01 20:55:56

标签: java design-patterns

我的问题很简单,但只是乍一看(对我来说:P) 我需要创建一个构建特征向量的类。此特征向量表示文本。特征如:Avarage word lenght,孔文本中的句子数等。

在其他功能计算过程中可以提取某些功能,这就是为什么我稍微修改了一个Builder设计模式,它看起来像这样:

我正在创建一个构建器对象:

FeatureVectorBuilder fvb = new FeatureVectorBuilder(String text/InputStream <- now it doesn't matter) 

然后我指定了一个订单,它表达了我希望包含的功能

fvb.setLenghtWord(True) <- for fixed length features
fvb.setXXXFeature(32) <- for variable length features

接下来我正在构建此向量:

fvb.buildFeatureVector() <- this way computations are optimized;

最后我有一个FeatureVector来获取。

fvb.getFeatureVector();

一切看起来都不错,但是...有大约32种不同的功能可以设置...
这样,悲观情况需要32个函数调用,同时创建一个32个参数的函数看起来很愚蠢。

我想知道是否有人遇到这样的问题并且可能有比“32种不同方法”方法更好的解决方案:)

2 个答案:

答案 0 :(得分:0)

构建器模式的一个要点是通过在构建器中用多个方法替换它们来避免具有大量参数的方法。如果你有32个可能的功能,那么在构建器中有32个方法对我来说很正常。

另一种可能性是将每个功能设计为一个类,并在构建器中添加这些类的实例:

builder.addFeature(new LengthWordFeature(true))
       .addFeature(new XxxFeature(32));

答案 1 :(得分:0)

干净地封装这些功能的一种可能性是:

abstract class Feature
{
    String name;
    ...
}

class NumericFeature extends Feature
{
    int value;
}

class OtherFeatureType extends Feature
{
    ....
}

Feature[] features = new Feature[] {
    new NumericFeature("xxxFeature", 32),
    new OtherFeature("feature1", ...),
    ...
};

FeatureVectorBuilder fvb = new FeatureVectorBuilder(text, features);