我現在正在開發一個圖像二值化庫,並且在這個庫中將實現經典的二值化方法,如Sauvola和Otsu方法。現在我的問題是如何優雅地設計圖書館。對於現在而言,我有兩個解決方案:圖像二值化庫的設計模式
解決方案1:
class Binarization
{
public:
BiinterfacePtr interface_;
enum BinarizationMethods
{
Method1, Method2, Method3, Method4
}
void set(BinarizationMethods method, Image *p_in, Image *p_out, Binarizationpara ¶)
{
if (method == Method1)
{
BiinterfacePtr interfacetemp(new BinarizationMethod1());
interface_ = interfacetemp;
}
if (method == Method2)
{
BiinterfacePtr interfacetemp(new BinarizationMethod2());
interface_ = interfacetemp;
}
....
}
bool run()
{
interface_->run();
}
Image* output()
{
return interface->output();
}
}
正如你所看到的,不同的二值化方法的實現在Biinterface
類完成。當我們使用Binarization
類時,我們可以通過調用set
方法來表示我們想要使用的方法。但是,不同的二值化方法可能會有不同的參數設置,Binarizationpara
的結構將變得複雜。
解決方案2
class BinarizationMethod1()
{
public:
perform_binarization(Image *p_in, Image *p_out, BinarizationMethod1Para ¶);
}
class BinarizationMethod2()
{
public:
perform_binarization(Image *p_in, Image *p_out, BinarizationMethod2Para ¶);
}
我的問題是哪一個更好。有關設計圖書館的想法將受到歡迎。謝謝!
你可能尋找的工廠模式(你有一個相當簡陋的實施)。各種構造函數簽名之間會有多少變化? – alrikai
@alrikai感謝您的評論。取決於所採用的二值化方法,構造函數簽名是相當不同的。我認爲Shinosha提供了一個很好的解決方案。 – feelfree