公司的類都需要使用單例模式實現,這個可以節省資源,避免重復對象的生成。但是靜態類也可以做到這一點,而且寫起來更簡潔,於是查閱相關資料,希望弄明白兩者的差別。
1.單例模式可以在用到的時候初始化,而靜態類會在程序開始運行時初始化?
通過自己的實踐,我認為這個說法是不對的。我寫了下面的例子進行實驗。
class Program { static void Main(string[] args) { Console.WriteLine(Class1.get(190)); GC.Collect(); Console.ReadKey(); } }
public static class Class1 { public static int[] arr = new int[20480000]; static Class1() { for (int i = 1; i < arr.Length; i++) { arr[i] = i; } } public static int get(int i) { return arr[i]; } }
程序進入主函數時,內存是這樣的
顯然靜態類中的arr沒有被初始化,繼續執行
可以看到這時靜態類的arr被初始化了,而且arr值全部為0時,內存並沒有變化,難道是微軟做了優化?
2.GOF對單件的第一句場景解釋就是“如果需要唯一實例”?
額,靜態類難道不是唯一實例么?
3.單例模式,解耦?
public interface IHelloWorld { string HelloWorld(); } //然后是接口的兩個實現. public class HelloWorldEnglish : IHelloWorld { string IHelloWorld.HelloWorld() { return "Hello World !"; } } public class HelloWorldChinese : IHelloWorld { string IHelloWorld.HelloWorld() { return "您好 世界 !"; } } public class People { private readonly IHelloWorld peopleHelloWorld; public People(IHelloWorld helloWorld) { this.peopleHelloWorld = CreateSingle() //這里你可以使用單例模式創建出來HelloWorldEnglish 或 HelloWorldChinese } public void SayHello() { Console.WriteLine(this.peopleHelloWorld.HelloWorld()); } }
這個代碼我看完了愣是沒明白解耦和單例啥關系,倒是明白了接口解耦挺好的(手動笑哭),下面大俠觀點與我相同,但還是沒有解開我的疑團
4.單例可以有繼承,實現接口,而靜態類不能
這個觀點我比較贊同,如果想使用單例,又想松耦合,就用單例模式吧。
靜態類比較適合工具類。
參考鏈接:
https://bbs.csdn.net/topics/390487790
https://www.cnblogs.com/zhangzt/p/4350556.html