设计模式-单例模式(程序员学习之路-架构之路)

     大家好,首先说点题外话,自己做软件这个行业已经有些年头了,在没有接触设计模式的时候,觉得代码只要能完成功能,就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的呢!

 学习是一件快乐的事情,让我们一起加油!

posted @ 2017-04-23 00:02  花瑶  阅读(282)  评论(0)    收藏  举报