现在我正在开发一个用于识别照片中的对象的类,并且此类由多个组件(类)组成。例如,这是一个使用抽象工厂模式的例子吗?
class PhotoRecognizer
{
public:
int perform_recogniton()
{
pPreProcessing->do_preprocessing();
pFeatureExtractor->do_feature_extraction();
pClassifier->do_classification()
}
boost::shared_ptr<PreProcessing> pPreProcessing;
boost::shared_ptr<FeatureExtractor> pFeatureExtractor;
boost::shared_ptr<Classifier> pClassifier;
}
在这个例子中,当我们使用这个类来进行识别,我们调用其他类PreProcessing
,FeatureExtractor
和Classifier
。正如你可以想象的那样,有很多不同的方法来实现每个类。例如,对于Classifier
类,我们可以使用SVMClassfier
或NeuralNetworkClassifer
,它是基本类Classifier
的派生类。
class SVMClassifier: public Classifier
{
public:
void do_classification();
};
因此,通过使用PhotoRecognizer
类中的不同元素,我们可以创建不同种PhotoRecongnizer
。现在,我正在构建一个基准,以了解如何将这些元素结合在一起以创建最佳PhotoRecognizer
。一个解决方案,我能想到的就是用抽象工厂:
class MethodFactory
{
public:
MethodFactory(){};
boost::shared_ptr<PreProcessing> pPreProcessing;
boost::shared_ptr<FeatureExtractor> pFeatureExtractor;
boost::shared_ptr<Classifier> pClassifier;
};
class Method1:public MethodFactory
{
public:
Method1():MethodFactory()
{
pPreProcessing.reset(new GaussianFiltering);
pFeatureExtractor.reset(new FFTStatictis);
pClassifier.reset(new SVMClassifier);
}
};
class Method2:public MethodFactory
{
public:
Method1():MethodFactory()
{
pPreProcessing.reset(new MedianFiltering);
pFeatureExtractor.reset(new WaveletStatictis);
pClassifier.reset(new NearestNeighborClassifier);
}
};
class PhotoRecognizer
{
public:
PhotoRecognizer(MethodFactory *p):pFactory(p)
{
}
int perform_recogniton()
{
pFactory->pPreProcessing->do_preprocessing();
pFactory->pFeatureExtractor->do_feature_extraction();
pFactory->pClassifier->do_classification()
}
MethodFactory *pFactory;
}
所以当我用方法一进行照片的认可,我可以简单地做到以下几点:
Method1 med;
PhotoRecognizer recogMethod1(&med);
med.perform_recognition()
更进一步,我甚至可以使类PhotoRecognizer
更紧凑:
enum RecMethod
{
Method1, Method2
};
class PhotoRecognizer
{
public:
PhotoRecognizer(RecMethod)
{
switch(RecMethod)
{
case Method1:
pFactory.reset(new Method1());
break;
...
}
}
boost::shared_ptr<MethodFactory> pFactory;
};
因此,这里是我的问题:是抽象工厂设计模式有充分理由在上述的情况呢?有其他解决方案吗?谢谢。
这与C++无关,为什么标记在那里? – Ceros
@Ceros演示代码在C++ – feelfree
但你的问题是关于代码设计而不是C++ – Ceros