设计模式-单例模式(程序员学习之路-架构之路)
大家好,首先说点题外话,自己做软件这个行业已经有些年头了,在没有接触设计模式的时候,觉得代码只要能完成功能,就OK了,在接触设计模式以后,我觉得不是这样的,虽然不能说用了设计模式的代码就一定好,但是不用设计模式的代码至少不是最优的代码,那么设计模式是什么?首先设计模式是一套理论,最早设计模式是用于建筑行业的,经由软件先辈反复总结出来的使用经验而已,设计模式它可以提高代码的可重用性,增强系统的可维护性,以及解决一系列的复杂问题,设计模式的优点有很多,我们一起来学习和了解吧!
本文章是连载文章,我会把23个设计模式进行一一例举,好了说了这么多了,我们开始今天的学习吧!
单例模式--(官网解释):确保类只有一个实例,而且自行实例化并向整个系统提供这个实例
(屌丝解释):就是这个类不能通过new来申明对象,只能通过类的对外静态方法提供
模式优点:1.内存只有一个实例,减少内存开支,尤其是对象需要频繁创建和销毁时;
2.单例模式只生成一个实例,所以减少了系统的性能开销;
3.单例模式可以避免对资源文件的多重占用;
4.单例模式可以在系统设置全局的访问点,优化和共享资源;
模式缺点:1.单例模式没有接口不便于扩展;
1 ing System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using static designpattrns_SingleModel.cto;
7 namespace designpattrns_SingleModel
8 {
9 /*单例模式:用大白话的理解,程序员与CTO的关系,一个公司的CTO只有一个,每个程序员每天都面对的是同一个CTO
10 在代码的世界里,CTO是cto类的一个实例,每个程序员调用cto类获取CTO对象的时候,肯定要求是同一个
11 人,这是公司组织架构决定的,因此我们需要保证每个程序员来向CTO汇报工作的时候(调用CTO类),都是同一个
12 CTO对象,所以cto类需要保证的是每次返回的实例(CTO)必须一样,不然,就容易产生多个CTO,既违背组织原则,
13 也容易导致管理混乱,关键是一个公司也不能存在多个CTO....*/
14 /// <summary>
15 /// 该类相当于老板
16 /// </summary>
17 class Program
18 {
19 static void Main(string[] args)
20 {
21 ///现在老板说开始工作,不要扯写没用的
22 ///干活的都是程序员,因此通知程序员吧,公司程序员就3个人.....
23 for (int i = 0; i < 3; i++)
24 {
25 cto leader = cto.getInstance(); //领导出场
26 leader.Say(); //讲话了
27 programer pg = new programer(leader, i.ToString());//程序员心中应该随时把CTO的话记在心里,我时刻就是把我们CTO的话记在心里的.....
28 pg.report();
29 }
30 //此代码是用来防止程序退出的(Net程序员您懂的)
31 Console.ReadKey();
32 }
33 }
34 /// <summary>
35 /// cto类负责产生CTO
36 /// </summary>
37 public class cto
38 {
39 private static cto CTO = new cto(); //生产一个CTO
40 //不让用户程序员自己随便new对象,否则容易产生多个CTO
41 private cto()
42 {
43 }
44 /// <summary>
45 /// 单例模式的核心
46 /// </summary>
47 /// <returns></returns>
48 public static cto getInstance() { return CTO; }
49
50 public void Say()
51 {
52 /*程序的屌丝内心,现实中不是CTO,只能在程序世界里面自我封官了哈。。。。*/
53 Console.WriteLine("我是公司的CTO,你们的工作需要想问汇报!");
54 }
55
56 /// <summary>
57 /// 程序员
58 /// </summary>
59 public class programer
60 {
61 /// <summary>
62 /// 把cto通过构造的方式传入,相当于程序员也时刻知道自己归谁领导... pmp也很重要......
63 /// </summary>
64 private cto ctoLeader;
65 private string Name;
66 public programer(cto CTOLeader, string name)
67 {
68 this.ctoLeader = CTOLeader;
69 this.Name = name;
70 }
71 /// <summary>
72 /// 开始汇报
73 /// </summary>
74 public void report()
75 {
76 Console.WriteLine($"我是公司的Java程序员-{Name},请你检阅我的工作!");
77 }
78 }
79 }
前面的单例模式,为饿汉式单例,什么意思呢?我感觉应该是不够吃哈,以为我是个吃货......
而单例模式,还有种设计,懒汉式单例,懒汉单例应该怎么写呢? 其实懒汉式单例与饿汉式单例的区别在与类的申明和返回不通,我们接着往下看:
1 public class cto
2 {
3 //private static cto CTO = new cto(); //生产一个CTO
4
5 ////不让用户程序员自己随便new对象,否则容易产生多个CTO
6 //private cto()
7 //{
8
9 //}
10
11 ///// <summary>
12 ///// 单例模式的核心
13 ///// </summary>
14 ///// <returns></returns>
15 //public static cto getInstance() { return CTO; }
16
17
18 //public void Say()
19 //{
20 // /*程序的屌丝内心,现实中不是CTO,只能在程序世界里面自我封官了哈。。。。*/
21 // Console.WriteLine("我是公司的CTO,你们的工作需要想问汇报!");
22 //}
23
24
25 private static cto CTO = null; //生产一个CTO
26
27 //不让用户程序员自己随便new对象,否则容易产生多个CTO
28 private cto()
29 {
30
31 }
32
33 /// <summary>
34 /// 单例模式的核心
35 /// </summary>
36 /// <returns></returns>
37 public static cto getInstance()
38 {
39 if (CTO == null) CTO = new cto();
40 return CTO;
41 }
42
43
44 public void Say()
45 {
46 /*程序的屌丝内心,现实中不是CTO,只能在程序世界里面自我封官了哈。。。。*/
47 Console.WriteLine("我是公司的CTO,你们的工作需要想问汇报!");
48 }
49 }
懒汉式单例模式,在低并发的情况下没有问题,但是系统压力增大,并发量增加时,可能会导致内存出现多个实例,破坏了单例模式最初预想,想想看,
在代码39 行 if (CTO == null) CTO = new cto();这段代码在高并发情况下,第一个线程A执行到CTO = new cto();时,但还没有获得对象,
对象初始化需要时间,第二个线程B也在执行,执行到if (CTO == null)判断,那么条件成立,于是也初始化了一个对象,那么内存中就可能出现多个对象,因此我建议搭建还是采用饿汉式单例模式,当然懒汉模式单例也可以用加锁的机制来解决!
好了,单例模式的分享就到这里了,单例模式是23个设计模式中最简单的设计模式,也是很常用的模式,单例模式的使用场景一般如下:
1.比如生成唯一序列号的环境
2.创建一个对象需要的资源和消耗特别多的,如访问IO和数据库资源
只要记住要求类只能有一个实例,那就单例模式就OK了!
今天的分享就到这里,里面的实例代码已上传至github:https://github.com/hyy829119/DesignModelCode.git
下一篇我们将继续讨论单例模式的扩展功能,也就是一个公司存在多个CTO的情况,现实中,我还真见过一个公司多个CTO的呢!
学习是一件快乐的事情,让我们一起加油!

浙公网安备 33010602011771号