<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      結合項目實例 回顧傳統設計模式(四)工廠模式(簡單工廠、普通工廠、抽象工廠)

      2011-10-04 13:19  熬夜的蟲子  閱讀(886)  評論(1)    收藏  舉報

      關于工廠模式和單例模式  大部分項目這2種模式都很常見

      例如在orm框架中 工廠模式常用來封裝數據庫的創建 我們分3種case來看 簡單工廠模式 普通工廠模式 抽象工廠模式

       抽象一點的說 工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。直接看實例

      一般慣性思維 我們遇到分支判斷時會這樣

       public class NormalCase
          {
              private DBInstance dbInstance;
              public NormalCase(string type)
              {
                    if (type.Equals("SQL"))
                  {
                      dbInstance=  new SqlInstance();
                  }
                  else if (type.Equals("Oracle"))
                  {
                      dbInstance = new OracleInstance();
                  }
                  else if (type.Equals("Mysql"))
                  {
                      dbInstance = new MysqlInstance();
                  }
              }
              public void ExecuteNonQuery()
              {
                  this.dbInstance.ExecuteNonQuery();
              }
              public void ExecuteDataset()
              {
                  this.dbInstance.ExecuteDataset();
              }
          }

      那么 new有什么不好,在技術上new沒什么錯,但是好的設計針對擴展開放而對修改關閉。

      針對接口編程,可以隔離掉以后系統可能發生的一大堆改變。如果代碼是針對接口編寫,那么通過多態,它可以與任何新類實現該接口。

      下面讓我們看看工廠模式如何解決該問題

      先來看看簡單工廠

       

      public class SimpleFactory
          {
              public DBInstance createinstance(string type)
              {
                  DBInstance di = null;
                  if (type.Equals("SQL"))
                  {
                      return new SqlInstance();
                  }
                  else if (type.Equals("Oracle"))
                  {
                      return new OracleInstance();
                  }
                  else if (type.Equals("Mysql"))
                  {
                      return new MysqlInstance();
                  }
                  return di;
                  
              }
          }

          public class SimpleCase
          {
              SimpleFactory facotory;
              DBInstance di;
              public SimpleCase(SimpleFactory facotory)
              {
                  this.facotory = facotory;
              }
              public DBInstance CreateInstance(string type)
              {            
                   di = facotory.createinstance(type);
                   return di;

              }
              public void ExecuteNonQuery()
              {
                  this.di.ExecuteNonQuery();
              }
              public void ExecuteDataset()
              {
                  this.di.ExecuteDataset();
              }

          }

       

      準確來說,簡單工廠并不是一種設計模式,反而比較像是一種編程習慣。上述case只是把問題從一個對象搬到另一個對象中,問題依然存在。但是SimpleFactory可以有許多客戶,把創建實例的代碼包裝進一個類,當以后實現改變時,只需修改這個類就可以了。物品們也正要把具體實例化的過程從客戶的代碼中刪除。

      下面我就來介紹下兩個重量級的模式!

      工廠方法模式

      public abstract class facotoryCase
          {
              DBInstance di;
              public DBInstance CreateInstance(string type)
              {          
                  di = create(type);
                  return di;
              }
             public abstract DBInstance create(string type);

             public void ExecuteNonQuery()
             {
                 this.di.ExecuteNonQuery();
             }
             public void ExecuteDataset()
             {
                 this.di.ExecuteDataset();
             }
          }

          public class facotoryCaseA : facotoryCase
          {
              public override DBInstance create(string type)
              {
                  if (type.Equals("SQL"))
                  {
                      return new SqlInstance();
                  }
                  else if (type.Equals("Oracle"))
                  {
                      return new OracleInstance();
                  }
                  return null;
              }
          }

          public class facotoryCaseB : facotoryCase
          {
              public override DBInstance create(string type)
              {
                  if (type.Equals("Mysql"))
                  {
                      return new MysqlInstance();
                  }          
                  return null;
              }
          }

      工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。

      設計原則:要依賴抽象不要依賴具體類。

      接下來再看下抽象工廠模式

      public class Param { }
          public class sqlparm : Param { }
          public class oracleparam : Param { }
          public class connection { }
          public class sqlconnecttion : connection { }
          public class oracleconnecttion : connection { }


          public interface abstractCase
          {
              Param GetParameter();
              connection GetConnection();
          }

          public abstract class DBInstanceforabstract
          {
              public Param p;
              public connection c;
              public abstract void ExecuteNonQuery();
              public abstract void ExecuteDataset();
          }

          public class DBInstanceforabstractA : DBInstanceforabstract
          {
              abstractCase ac;
              public DBInstanceforabstractA(abstractCase ac)
              {
                  this.ac = ac;
              }
              public override void ExecuteNonQuery()
              {
                  p = ac.GetParameter();         
              }
              public override void ExecuteDataset()
              {
                  c = ac.GetConnection();
                
              }
               
          }

          public class abstractCaseA : abstractCase
          {
              DBInstanceforabstract di;
              public Param GetParameter()
              {
                  return new sqlparm();
              }
              public connection GetConnection()
              {
                  return new sqlconnecttion();
              }
          }

          public class abstractCaseB : abstractCase
          {
              DBInstanceforabstract di;
              public Param GetParameter()
              {
                  return new oracleparam();
              }
              public connection GetConnection()
              {
                  return new oracleconnecttion();
              }
          }

      抽象工廠模式提供一個接口,用于創建相關或依賴對象的家族而不需要明確指定具體類。

      主站蜘蛛池模板: 熟女一区| 丁香五月激情综合色婷婷| 亚洲一区二区视频在线观看| 国产偷窥熟女高潮精品视频| 亚洲人午夜精品射精日韩| 女高中生强奷系列在线播放| 亚洲欧美日韩综合久久久| 亚洲成人午夜排名成人午夜| 日韩免费码中文在线观看| 亚洲精品一区久久久久一品av | 胶南市| 色色97| 亚洲免费成人av一区| 日本中文一区二区三区亚洲| 激情国产一区二区三区四| 亚洲国产精品无码观看久久| 亚洲av精彩一区二区| 亚洲午夜福利AV一区二区无码| 国产永久免费高清在线| 久久热在线视频精品视频| 欧美寡妇xxxx黑人猛交| 国产一区二区不卡在线| 国产亚洲精品久久久久久大师| 色欲av久久一区二区三区久| 国产中文字幕在线一区| 国产av不卡一区二区| 日本一卡2卡3卡四卡精品网站| 色综合久久中文综合久久激情| 午夜福利国产盗摄久久性| 大香伊蕉在人线国产最新2005| 少妇xxxxx性开放| 久热这里只有精品在线观看| 最新高清无码专区| 99久热在线精品视频| 日韩精品区一区二区三vr| 国产精品白浆无码流出| 亚洲精品美女一区二区| 又粗又硬又黄a级毛片| 精品日韩精品国产另类专区 | 国产精品伦理一区二区三| 毛多水多高潮高清视频|