延續上一篇 C# Strategy Pattern練習: Get Image Features
這次改用Fatory Pattern方式撰寫, 上一篇是將三種方法抽象化一種interface: iFeature, 三種方法繼承iFeature並實作之
不像Factory Pattern用interface, Factory Pattern改用抽象方法(abstract class), 直接嵌入在抽象類別FeatureExtractor之中, 繼承FeatureExtractor的子類別都必須overwrite getFeatures()該抽象方法
1: public abstract class FeatureExtractor
2: {
3: // 宣告一個抽象方法, 所繼承的類別必須實作之
4: public abstract void getFeatures();
5: }
新增一個windows form專案
選擇該FactoryPatternGetImageFeatures專案, 滑鼠右鍵 <加入><新增項目>
選擇<類別>, 名稱命名為FactoryPattern
1: public abstract class FeatureExtractor
2: {
3: // 宣告一個抽象方法, 所繼承的類別必須實作之
4: public abstract void getFeatures();
5: }
接下來寫三個繼承FeatureExtractor抽象類別的子類別
1: public class SIFT : FeatureExtractor
2: {
3: public override void getFeatures()
4: {
5: MessageBox.Show("在此實作SIFT...");
6: }
7: }
1: public class SURF : FeatureExtractor
2: {
3: public override void getFeatures()
4: {
5: MessageBox.Show("在此實作SURF...");
6: }
7: }
1: public class HOG : FeatureExtractor
2: {
3: public override void getFeatures()
4: {
5: MessageBox.Show("在此實作HOG...");
6: }
7: }
最後定義一個ImageFeature內含一個靜態函式供外部呼叫, 根據所傳入的方法字串決定動態回傳的特定方法實體
1: public class ImageFeature
2: {
3: // 宣告一個靜態方法,方便步用實體即可呼叫使用
4: public static FeatureExtractor getInstance(string Method)
5: {
6: switch (Method)
7: {
8: case "SIFT":
9: return new SIFT();
10:
11: case "SURF":
12: return new SURF();
13: case "HOG":
14: return new HOG();
15: default:
16: return new SIFT();
17: }
18: }
19: }
------------------------------------------------------------------------------------------------------------------------------------
在按鈕Click事件中
line 3: 動態取得方法實體
line 4: 執行特定影像特徵擷取方法
1: private void button3_Click(object sender, EventArgs e)
2: {
3: FeatureExtractor fs = ImageFeature.getInstance(comboBox1.Text);
4: fs.getFeatures();
5: }
全站熱搜