成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

值得永久收藏的 C# 設計模式套路

開發 后端
關于設計模式的說法,網上一搜一大堆,咱就不再去說了。我的理解,設計模式就是很多NB的大佬們總結出來的,用來處理特定情況的標準解決方案。

[[434250]]

關于設計模式的說法,網上一搜一大堆,咱就不再去說了。

我的理解,設計模式就是很多NB的大佬們總結出來的,用來處理特定情況的標準解決方案。

那既然是標準方案,就一定會有套路,會有標準的樣子。

幾種常見的設計模式,都有各自的套路模板。下面進入主題,咱們一個一個來說。

一、抽象工廠模式

抽象工廠主要的場景是創建一系列相關或相似的對象。注意這個相關或相似。因為有這個特性,我們就可以抽取出共同點,來形成接口或抽象類,然后通過這個接口或抽象類,來派生出各個對象。

為什么叫抽象工廠?不知道,而且不重要。在我看來,這只是個名字,記下就好。一個東西出來,總要有個名字的,有個人跑出來說,就叫抽象工廠吧。于是就叫抽象工廠了。就像一個人,做了一個網站,讓別人在上面賣東西,后來做大了,需要吹NB了,得給這個經營方式起個名字,于是,B2C 就出現了。現在人們創業做電商,頭一件事先討論做 B2B 還是 B2C。做反了。先做吧,掙錢要緊。做大了,你說叫什么,都會有人聽、有人信。

說跑題了,:P

?

先寫幾個類型,包括接口和實體類,后面會用到:

  1. // 接口定義 
  2. public interface ILaptop 
  3.     void GetInfo(); 
  4. public interface IMobile 
  5.     void GetInfo(); 
  6.  
  7. // 實體類一 
  8. public class MateBook : ILaptop 
  9.     public void GetInfo() 
  10.     { 
  11.         Console.WriteLine("I am MateBook"); 
  12.     } 
  13. public class Mac : ILaptop 
  14.     public void GetInfo() 
  15.     { 
  16.         Console.WriteLine("I am Mac"); 
  17.     } 
  18.  
  19. // 實體類二 
  20. public class Mate : IMobile 
  21.     public void GetInfo() 
  22.     { 
  23.         Console.WriteLine("I am Mate"); 
  24.     } 
  25. public class IPhone : IMobile 
  26.     public void GetInfo() 
  27.     { 
  28.         Console.WriteLine("I am IPhone"); 
  29.     } 

有了上面的類型,我們來看看抽象工廠的套路。

定義:

  1. public interface IFactory 
  2.     ILaptop CreateLaptop(); 
  3.     IMobile CreateMobile(); 
  4. public class FactoryA : IFactory 
  5.     public ILaptop CreateLaptop() 
  6.     { 
  7.         return new MateBook(); 
  8.     } 
  9.     public IMobile CreateMobile() 
  10.     { 
  11.         return new Mate(); 
  12.     } 
  13. public class FactoryB : IFactory 
  14.     public ILaptop CreateLaptop() 
  15.     { 
  16.         return new Mac(); 
  17.     } 
  18.     public IMobile CreateMobile() 
  19.     { 
  20.         return new IPhone(); 
  21.     } 

調用:

  1. public static class Example 
  2.     public static void ExampleTest() 
  3.     { 
  4.         var factoryA = new FactoryA(); 
  5.         var laptopA = factoryA.CreateLaptop(); 
  6.         var mobileA = factoryA.CreateMobile(); 
  7.         laptopA.GetName(); 
  8.         mobileA.GetName(); 
  9.  
  10.         var factoryB = new FactoryB(); 
  11.         var laptopB = factoryB.CreateLaptop(); 
  12.         var mobileB = factoryB.CreateMobile(); 
  13.         laptopB.GetName(); 
  14.         mobileB.GetName(); 
  15.     } 
  16.     //result : 
  17.     //I am MateBook 
  18.     //I am Mate 
  19.     //I am Mac 
  20.     //I am IPhone 

這個模式里面,核心的部分就是工廠接口的定義:

  1. public interface IFactory 
  2.     ILaptop CreateLaptop(); 
  3.     IMobile CreateMobile(); 

在這個工廠接口中,加入了多個相似的接口。于是,調用端可以很簡單的以類似的方式去調用,而工廠實體中,對內部引用的實體進行區分。一個典型的場景是:一個程序,對著很多種數據庫。這樣的情況,可以在工廠實體中區分具體連接哪種數據庫,而內部的引用實體,則各自對應不同的數據庫。外部調用時,只需要在初始化時確認使用哪種數據庫,后面的 CRUD 操作,就直接使用就成,調用端不需要考慮數據庫的區別。事實上,這也是抽象工廠用的最多的場景。

二、工廠模式

去掉了抽象兩個字,居然還是一個模式,而且是一個不同的模式。這個名字起的夠混亂。

不過老實說,工廠模式跟抽象工廠模式很像,區別是:抽象工廠模式是在工廠模式的基礎上,又做了一層抽象。

看套路:

  1. public interface IFactory 
  2.     ILaptop CreateLaptop(); 
  3. public class FactoryA : IFactory 
  4.     public ILaptop CreateLaptop() 
  5.     { 
  6.         return new MateBook(); 
  7.     } 
  8. public class FactoryB : IFactory 
  9.     public ILaptop CreateLaptop() 
  10.     { 
  11.         return new Mac(); 
  12.     } 
  13. public static class Example 
  14.     public static void Test() 
  15.     { 
  16.         var factoryA = new FactoryA(); 
  17.         var laptopA = factoryA.CreateLaptop(); 
  18.         laptopA.GetName(); 
  19.  
  20.         var factoryB = new FactoryA(); 
  21.         var laptopB = factoryB.CreateLaptop(); 
  22.         laptopB.GetName(); 
  23.     } 
  24.     //result : 
  25.     //I am MateBook 
  26.     //I am Mac 

看到了吧,跟抽象工廠確實很相似。不過在使用上,工廠模式用得會更多。任何類都可以按工廠模式來寫。這個模式最大的作用,是把定義和實體做了分層。開發時,可以一部分人去定義接口,而另一部分人去實現這個接口。而且,工作模式可以隨時擴展為抽象工廠。比方一開始只是可能有多種數據庫,但具體是哪些數據庫還沒確定,就可以先按工廠模式寫,等數據庫定下來,隨時就很容易轉為抽象工廠了。

三、建造者模式

這個名稱起的更不知所云了,就因為一個 Builder?

其實他說的是這么個事。我們經常看到這樣的代碼:

  1. var mobile = new MobileBuilder() 
  2.                 .WithBrand("Apple"
  3.                 .WithModel("13Pro"
  4.                 .WithMemory("512G"
  5.                 .Build(); 

看著是不是很洋氣?

來看看這個套路:

  1. // 這就是個數據模型 
  2. public class Mobile 
  3.     public string Brand { get; set; } 
  4.     public string Model { get; set; } 
  5.     public string Memory { get; set; } 
  6.  
  7. // 這才是 Builder 的定義 
  8. public class MobileBuilder 
  9.     private readonly Mobile _mobile = new Mobile(); 
  10.     public MobileBuilder WithBrand(string brand) 
  11.     { 
  12.         _mobile.Brand = brand; 
  13.         return this; 
  14.     } 
  15.     public MobileBuilder WithModel(string model) 
  16.     { 
  17.         _mobile.Model = model; 
  18.         return this; 
  19.     } 
  20.     public MobileBuilder WithMemory(string memory) 
  21.     { 
  22.         _mobile.Memory = memory; 
  23.         return this; 
  24.     } 
  25.     public Mobile Build() 
  26.     { 
  27.         return _mobile; 
  28.     } 

然后就可以這樣調用了:

  1. public static class Example 
  2.     public static void Test() 
  3.     { 
  4.         var mobile = new MobileBuilder() 
  5.                         .WithBrand("Apple"
  6.                         .WithModel("13Pro"
  7.                         .WithMemory("512G"
  8.                         .Build(); 
  9.         Console.WriteLine(mobile.ToJson()); 
  10.     } 
  11.     //result : 
  12.     //{"Brand":"Apple","Model":"13Pro","Memory":"512G"

個人而言,我很喜歡這個套路,沒有別的,就是洋氣,非常的洋氣。應用場景也非常多,所有數據的 DTO,都可以么寫。

四、原型模式

這個模式聽著會有點陌生。看過一些文章,也把它歸為是創建型模式。實際上,我更傾向于把它看作是一種代碼結構,而不是模式。這種結構最大的作用,是復制 - 通過復制一個存在的實例來創建新實例。

代碼是這樣的:

  1. public class MobilePackage 
  2.     public string Color { get; set; } 
  3.     public Mobile Mobile { get; set; } 
  4.  
  5.       // 下面才是模式代碼 
  6.     public MobilePackage ShallowCopy() 
  7.     { 
  8.         return (MobilePackage)this.MemberwiseClone(); 
  9.     } 
  10.     public MobilePackage DeepCopy() 
  11.     { 
  12.         var clone = (MobilePackage)this.MemberwiseClone(); 
  13.         clone.Color = new string(Color); 
  14.         clone.Mobile = new Mobile 
  15.         { 
  16.             Brand = new string(Mobile.Brand), 
  17.             Model = new string(Mobile.Model), 
  18.             Memory = new string(Mobile.Memory), 
  19.         }; 
  20.         return clone; 
  21.     } 

看看,其實就是一段復制代碼。

但是要注意,對于深拷貝和淺拷貝,涉及到指針和引用,如果你不熟悉,了解后再用。看一下上面的結果:

  1. public static class Example 
  2.     public static void Test() 
  3.     { 
  4.         var mobilePackage = new MobilePackage 
  5.         { 
  6.             Color = "White"
  7.             Mobile = new Mobile 
  8.             { 
  9.                     Brand = "Apple"
  10.                     Model = "13Pro"
  11.                     Memory = "512G"
  12.             } 
  13.         }; 
  14.  
  15.         var shallowCopied = mobilePackage.ShallowCopy(); 
  16.         var deepCopied = mobilePackage.DeepCopy(); 
  17.  
  18.         mobilePackage.Color = "Black"
  19.         mobilePackage.Mobile.Brand = "Huawei"
  20.         mobilePackage.Mobile.Model = "Mate"
  21.  
  22.         Console.WriteLine(mobilePackage.ToJson()); 
  23.         Console.WriteLine(shallowCopied.ToJson()); 
  24.         Console.WriteLine(deepCopied.ToJson()); 
  25.     } 
  26.  
  27.     //result: 
  28.     //{"Color":"Black","Mobile":{"Brand":"Huawei","Model":"Mate","Memory":"512G"}} 
  29.     //{"Color":"White","Mobile":{"Brand":"Huawei","Model":"Mate","Memory":"512G"}} 
  30.     //{"Color":"White","Mobile":{"Brand":"Apple","Model":"13Pro","Memory":"512G"}} 

結果和你理解的是不是一樣?如果不一樣,去研究一下值和引用的區別。另外,C# 10 里新出來的 Record,就是一個典型的原型模式的類型,也可以了解一下。

五、單例模式

單例模式也是一個用處非常大的模式,而且這個名字起得挺直白。

單例模式,簡單點說就是不管你 new 多少回,實際應用全局內存中只會有一份實例。

套路代碼特別簡單:

  1. public sealed class Singleton 
  2.     private static Singleton _instance; 
  3.     private static readonly object _locker = new object(); 
  4.  
  5.     private Singleton() 
  6.     { 
  7.     } 
  8.  
  9.     public static Singleton GetInstance() 
  10.     { 
  11.         if (_instance == null
  12.         { 
  13.             lock (_locker) 
  14.             { 
  15.                 if (_instance == null
  16.                 { 
  17.                     _instance = new Singleton(); 
  18.                 } 
  19.             } 
  20.         } 
  21.         return _instance; 
  22.     } 

這里有兩個注意點:

類聲明用到 sealed 關鍵字,以確保這個類不會被派生。

類構造函數用了 private,以確保這個類不會被 new。這本身與單例無關,只是通過這種方式來表明這是一個單例。控制單例的最核心的代碼,其實是下面的 GetInstance() 方法。

調用時,就是下面一行代碼:

  1. Singleton singleton = Singleton.GetInstance(); 

就OK了。

設計模式有很多種,對應的套路也有很多。其中,有一些是簡單無腦的套路,像上面的單例,而另一些就會比較復雜。

不過,既然是套路,總是有固定的代碼或結構可循的。

我這個主題,打算分幾篇來寫。這是第一篇。

 

最后做個小注解:套路雖簡單,也要吃透了再用。而且,有時候簡單的代碼就能很好地完成任務,一定不要過度使用。

 

責任編輯:武曉燕 來源: 老王Plus
相關推薦

2021-12-01 09:23:13

C# 模式套路

2024-03-20 10:59:37

開源

2009-08-26 10:24:04

C# Observer

2009-09-02 16:23:27

C# Singleto

2009-04-29 09:06:18

C#設計模式Adapter

2024-07-22 08:09:28

C#模式架構

2009-08-31 16:01:31

C#和設計模式

2024-07-31 10:41:16

C#設計模式

2013-02-26 10:55:47

C#適配器設計模式

2023-01-13 09:53:32

2009-08-04 09:22:26

C#工廠模式

2010-11-29 09:26:05

jQuery特效

2009-08-31 16:12:02

C#使用Singlet

2024-07-31 08:33:17

2019-04-22 15:00:05

CSS前端開發

2017-01-03 17:51:21

AndroidViewHolder工具類

2013-07-22 10:01:03

JavascriptWeb

2009-08-26 16:26:37

C#迭代器模式

2009-08-11 13:59:41

迭代器模式C# Iterator

2009-08-25 18:04:30

C#實現Singlet
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品精品视频一区二区三区 | 一区二区三区四区免费视频 | 亚洲精品久久久久久宅男 | 欧美日韩在线一区二区 | 欧美一区二区三区免费电影 | 国产精品中文在线 | 中文字幕一区二区三区在线乱码 | 麻豆av在线免费观看 | 日韩性在线| 国产乱码一区 | 亚洲欧洲色视频 | av中文字幕在线播放 | 欧美日韩成人影院 | 日韩二区 | 凹凸日日摸日日碰夜夜 | 蜜桃特黄a∨片免费观看 | 成人黄色av | 日韩一区在线视频 | 久久久国产精品入口麻豆 | 亚洲精品一二三区 | 国产黄色精品在线观看 | 久久久久久久久久久国产 | 中文字幕不卡在线88 | 国产一区二区激情视频 | 成人在线国产 | 亚洲精品一区二三区不卡 | 粉嫩国产精品一区二区在线观看 | 精品免费在线 | japan25hdxxxx日本 做a的各种视频 | 欧美日韩国产一区二区三区 | 999国产视频 | 美女国内精品自产拍在线播放 | 精品国产乱码久久久久久影片 | 免费视频二区 | 久久久久久91 | 91精品久久久久久久久中文字幕 | 国产免费av在线 | 狠狠躁夜夜躁人人爽天天高潮 | 91精品观看| 日韩成人免费视频 | 狠狠干夜夜草 |