延續上一篇  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專案

image

選擇該FactoryPatternGetImageFeatures專案, 滑鼠右鍵 <加入><新增項目>

image

選擇<類別>, 名稱命名為FactoryPattern

image

image

   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:     }

------------------------------------------------------------------------------------------------------------------------------------

image

在按鈕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: }
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 me1237guy 的頭像
    me1237guy

    天天向上

    me1237guy 發表在 痞客邦 留言(0) 人氣()