亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計模式-工廠模式

2019-11-14 15:45:28
字體:
來源:轉載
供稿:網友

 1:簡單工廠模式

簡單工廠模式我個人覺得就是為了讓客戶程序和類的對象分離,用戶不在考慮去調用哪個方法,我只需要告訴你我的一些特征就可以調用相應的對象,以下用來自不同國籍的人來說明

a:如果現在做一個關于統計中國人,美國人,和日本人的一個功能,第一個我們考慮創建一個接口關于對人的基本操作

 1 public interface iperson 2     { 3         /// <summary> 4         /// 添加 5         /// </summary> 6         /// <param name="person"></param> 7         /// <returns></returns> 8         bool Add(Person person); 9 10         /// <summary>11         /// 刪除12         /// </summary>13         /// <param name="id"></param>14         /// <returns></returns>15         bool Delete(string id);16 17         /// <summary>18         /// 修改19         /// </summary>20         /// <param name="person"></param>21         /// <returns></returns>22         bool Update(Person person);23 24         /// <summary>25         /// 獲取26         /// </summary>27         /// <param name="id"></param>28         /// <returns></returns>29         bool Get(string id);30     }
人行為的接口

b:定義一個來自不同國籍的枚舉

 1 /// <summary> 2     /// 表示國籍的枚舉 3     /// </summary> 4     public enum Nationality { 5         [Description("中國國籍")] 6         China = 0, 7         [Description("美國國籍")] 8         America = 1, 9         [Description("日本國籍")]10         Japan = 211     }
定義枚舉

c:實現接口類

 1 public class ChinaPerson:IPerson { 2        PRivate readonly string _conn; 3  4        public ChinaPerson() 5        { 6            _conn = ConfigurationManager.ConnectionStrings["dblink"].ConnectionString; 7        } 8  9        public bool Add(Person person)10        {11            const string sql = "insert into china(Id,UserName,RealName,Nationality,AddDate)values(@Id,@UserName,@RealName,@Nationality,@AddDate)";12            var parameters = new[]13             {14                 new MySQLParameter("@Id", person.Id),15                 new MySqlParameter("@UserName", person.UserName),16                 new MySqlParameter("@RealName", person.RealName),17                 new MySqlParameter("@Nationality",person.Nationality), 18                 new MySqlParameter("@AddDate", person.AddDate)19             };20            return MySqlHelper.ExecuteNonQuery(_conn, CommandType.Text, sql, parameters) > 0;21        }22 23        public bool Delete(string id)24        {25            const string sql = "delete from china where Id=@id";26            var parameters = new[]27             {28                 new MySqlParameter("@Id", id)29             };30            return MySqlHelper.ExecuteNonQuery(_conn, CommandType.Text, sql, parameters) > 0;31        }32 33        public bool Update(Person person)34        {35            throw new NotImplementedException();36        }37 38        public Person Get(string id)39        {40            const string sql = "select * from china where Id=@Id";41            var parameters = new[]42             {43                 new MySqlParameter("@Id", id)44             };45            var mySqlHelper = new MySqlHelper(_conn);46            var dateReader = mySqlHelper.ExecuteDataReader(CommandType.Text, sql, parameters);47            var p=new Person();48            while (dateReader.Read())49            {50                p.Id = dateReader["Id"].ToString();51                p.UserName = dateReader["UserName"].ToString();52                p.Nationality = (Nationality)dateReader["Nationality"];53                p.RealName = dateReader["RealName"].ToString();54            }55            return p;56        }57    }
實現接口類

d:工廠根據客戶端類型返回不同的實現對象

 1 public class SimpleFactory 2     {     3         public static IPerson Create(Nationality nationality) 4         { 5             switch (nationality) 6             { 7                 case Nationality.China: 8                     return new ChinaPerson(); 9                     break;10                 case Nationality.America:11                     return new AmericaPerson();12                     break;13                 case Nationality.Japan:14                     return new JapanPerson();15                     break;16                 default:17                     throw new Exception("參數不匹配,請驗證");18                     break;19             }20         }
工廠類

 e:客戶端調用

 1 //China 2             IPerson chinaPerson = SimpleFactory.Create(Nationality.China); 3             bool result= chinaPerson.Add(new Person 4             { 5                 Id = Guid.NewGuid().ToString(), 6                 UserName = "zs", 7                 RealName = "張三", 8                 Nationality = Nationality.China, 9                 AddDate = DateTime.Now10             });           11             if (result)12             {13                 Console.WriteLine("添加成功");14             }15             var p = chinaPerson.Get("6a41924f-804b-4425-b5ab-19ab21311511");16             Console.WriteLine(string.Format("我是{0},來自中國",p.RealName));17 18             //美國19             IPerson americaPerson = SimpleFactory.Create(Nationality.America);20             bool result1 = americaPerson.Add(new Person21             {22                 Id = Guid.NewGuid().ToString(),23                 UserName = "ls",24                 RealName = "李四",25                 Nationality = Nationality.America,26                 AddDate = DateTime.Now27             });28             if (result1) {29                 Console.WriteLine("添加成功");30             }31             var person = americaPerson.Get("91955e6d-c6cc-4a25-933f-243753d12b9a");32             Console.WriteLine(string.Format("我是{0},來自美國", person.RealName));
客戶端調用

f:查看效果

ok這整個過程就是一個簡單工廠

注意事項:

1:建立簡單工廠的時候我個人意見覺得參數最好是枚舉或者寫在配置文件中,這樣的好處就是如果以后修改就改枚舉或者配置文件即可。出錯的概率會減小很多

優點:使用簡單工廠符合低耦合的思想,讓客戶程序和具體實現對象分離,當修改具體實現對象的時候只需要在工廠中進行邏輯修改即可并不需要客戶端去做修改。

缺點:并不符合開閉原則,因為當增加一個對象的時候就需要修改工廠,只要有修改就有可能影響現有項目的穩定性,同時如果有50個對象的時候可以switch 50 次這樣就太多了。

2:工廠模式

工廠模式是在簡單工廠模式的一種擴展,靈活性很強,當需要創建一個新的國籍的人的時候只需要添加并不用修改已有的代碼,這樣一來就會保證原先項目的穩定

先看一副簡單的圖

a:首先創建一個抽象的接口

 1 public interface IPerson 2     { 3         /// <summary> 4         /// 添加 5         /// </summary> 6         /// <param name="person"></param> 7         /// <returns></returns> 8         bool Add(Person person); 9 10         /// <summary>11         /// 刪除12         /// </summary>13         /// <param name="id"></param>14         /// <returns></returns>15         bool Delete(string id);16 17         /// <summary>18         /// 修改19         /// </summary>20         /// <param name="person"></param>21         /// <returns></returns>22         bool Update(Person person);23 24         /// <summary>25         /// 獲取26         /// </summary>27         /// <param name="id"></param>28         /// <returns></returns>29         Person Get(string id);30     }
接口

b:然后在創建繼承這個抽象接口的實體類

1 /// <summary>2     /// 日本的工廠類3     /// </summary>4   public class JapanFactory:IFactory {5       public IPerson Create()6       {7          return  new JapanPerson();8       }9   }
日本工廠類
1 /// <summary>2     /// 中國工廠類3     /// </summary>4     public class ChinaFactory:IFactory {5         public IPerson Create()6         {7             return new ChinaPerson();8         }9     }
中國工廠類

c:在客戶端調用

 1 //china 2             IFactory factory=new ChinaFactory(); 3             IPerson chinaPerson = factory.Create(); 4             bool result = chinaPerson.Add(new Person { 5                 Id = Guid.NewGuid().ToString(), 6                 UserName = "zs", 7                 RealName = "張三", 8                 Nationality = Nationality.China, 9                 AddDate = DateTime.Now10             });11             if (result) {12                 Console.WriteLine("中國 添加成功");13             }14 15             //japan16             IFactory factory1 = new ChinaFactory();17             IPerson japanPerson = factory.Create();18             bool result1 = japanPerson.Add(new Person {19                 Id = Guid.NewGuid().ToString(),20                 UserName = "ls",21                 RealName = "李四",22                 Nationality = Nationality.America,23                 AddDate = DateTime.Now24             });25             if (result1) {26                 Console.WriteLine("日本 添加成功");27             }
客戶端

d:查看效果

 優點:符合開閉原則,不需要修改已有的業務即可添加新的國籍的人,有很好的靈活性

 缺點:需要創建更多的類(這個算不算)

上述兩種模式在實際應用中可以聯合使用以下關于工廠模式的一些總結

關于兩種工廠模式的總結

用途:

1:工廠方法模式是一種輕量級模式,它實現了與應用特定模型的獨立??蛻糁换诮涌诰幊潭屇J絹斫鉀Q其他問題

2:工廠模式有一個特殊的優點就是它能夠連接起平行的類層次。

使用場景:

1:靈活性很重要

2:對象可以通過子類進行擴展

3:客戶程序把職責委托給平行層次的子類


上一篇:DATATable轉為json

下一篇:java之log4j的配置

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久精品国产| 91久久久久久久久久| 热久久视久久精品18亚洲精品| 精品久久中文字幕| 日韩欧美aaa| 欧美一区二区三区……| 91高清视频免费观看| 亚洲欧美激情一区| 欧美日韩国产中文字幕| 中文字幕九色91在线| 亚洲国产精品va在看黑人| 久久九九免费视频| 亚洲男人天堂2023| 精品夜色国产国偷在线| 91国产中文字幕| 久久精品久久久久久国产 免费| 尤物99国产成人精品视频| 亚洲成人精品视频| 在线亚洲男人天堂| 欧美成人精品三级在线观看| 国产在线不卡精品| 中文字幕不卡av| 国产色综合天天综合网| 欧美日韩ab片| 国产精品视频在线观看| 夜夜嗨av色综合久久久综合网| 亚洲3p在线观看| 欧美日韩xxxxx| 亚洲第一页在线| 日韩中文在线观看| 日韩暖暖在线视频| 97香蕉超级碰碰久久免费软件| 97在线观看免费| 国产成人福利夜色影视| 亚洲国产精品va在线观看黑人| 日韩电影中文字幕在线观看| 亚洲色图欧美制服丝袜另类第一页| 精品国产乱码久久久久久虫虫漫画| 国产精品永久在线| 欧美丰满片xxx777| 亚洲成年人在线| 欧美麻豆久久久久久中文| 成人免费xxxxx在线观看| 久久国产精品久久久| 亚洲尤物视频网| 久久免费成人精品视频| 久久久久久噜噜噜久久久精品| 国产成人91久久精品| 久久综合亚洲社区| 日韩精品高清在线观看| 国产91在线播放精品91| 久久久久久成人| 国产精品成人久久久久| 日韩精品免费在线| 黄色一区二区在线观看| 日本免费在线精品| …久久精品99久久香蕉国产| 色综合天天狠天天透天天伊人| 国内精品久久久久久中文字幕| 日本亚洲精品在线观看| 欧美成人亚洲成人| 欧美最猛性xxxxx(亚洲精品)| 97在线看免费观看视频在线观看| 国产欧美精品在线| 日韩国产一区三区| 欧美日韩一区二区在线| 精品久久久久久国产| 久久久亚洲影院| 国产成人精品日本亚洲专区61| 色老头一区二区三区在线观看| 久久影院在线观看| 亚洲精品国产精品国自产观看浪潮| 国模精品系列视频| www.久久撸.com| 国产精品a久久久久久| 亚洲人成欧美中文字幕| 一本色道久久88亚洲综合88| 国产精品一区二区在线| 亚洲人免费视频| 欧美国产第一页| 亚洲r级在线观看| 91免费在线视频网站| 亚洲深夜福利视频| 成人av在线网址| 欧美性xxxxx极品| 亚洲日本欧美日韩高观看| 欧美综合一区第一页| 久久97久久97精品免视看| 国产精品成人品| 日韩电影中文字幕在线观看| 欧美日韩免费看| 最近2019中文字幕大全第二页| 国产一区二区三区久久精品| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲欧美在线磁力| 欧美大片免费观看在线观看网站推荐| 国产精品久久久久9999| 亚洲精品久久7777777| 久久久91精品国产| 久久精品色欧美aⅴ一区二区| 欧美中文字幕视频在线观看| 亚洲电影免费在线观看| 川上优av一区二区线观看| 亚洲精品一区中文字幕乱码| 九九视频这里只有精品| 日韩美女福利视频| 亚洲第五色综合网| 欧美成人黑人xx视频免费观看| 影音先锋日韩有码| 国产精品成人av性教育| 国产精品欧美一区二区三区奶水| 欧美日韩综合视频网址| 亚洲欧美综合图区| 成人亲热视频网站| 亚洲欧美中文日韩在线v日本| 都市激情亚洲色图| 精品一区精品二区| 国产大片精品免费永久看nba| 日韩精品极品视频免费观看| 国产精品xxx视频| 精品女同一区二区三区在线播放| 亚洲欧美成人一区二区在线电影| 亚洲一区二区三区久久| 国产性色av一区二区| zzjj国产精品一区二区| 中文字幕一区二区精品| 久久五月天色综合| 热久久免费国产视频| 欧美精品在线看| 亚洲免费小视频| 精品偷拍各种wc美女嘘嘘| 日韩欧美极品在线观看| 超薄丝袜一区二区| 日韩精品在线第一页| 97超级碰在线看视频免费在线看| 日韩精品中文字幕在线观看| 久久久免费av| 亚洲精品久久久久中文字幕欢迎你| 在线播放国产一区中文字幕剧情欧美| 丝袜一区二区三区| 97av在线视频免费播放| 欧美综合国产精品久久丁香| 久久久精品2019中文字幕神马| 欧美日韩国产限制| 亚洲va久久久噜噜噜久久天堂| 精品成人乱色一区二区| 亚洲福利精品在线| 一区二区在线视频| 91精品中文在线| 美女999久久久精品视频| 国产亚洲精品久久久久动| 国产在线播放不卡| 亚洲午夜久久久影院| 夜夜躁日日躁狠狠久久88av| 日韩精品在线观看网站| 国产精品日韩久久久久| 国产日韩精品在线播放| 97精品国产97久久久久久| 国产精品成人v| 91极品视频在线| 国产精品视频在线播放| 最新69国产成人精品视频免费| 国产一区av在线| 国产视频在线观看一区二区|