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

大家好,接着上一篇文章,我们继续了解单例模式的扩展功能以及一些注意的事项!

上一篇我们说道,当为懒汉式单例模式的时候,可能存在线程并发导致实例出现多个的问题,这个问题,在Net中通过Lock加锁来实现,在Java中通过syncronized关键字来实现!由于这个代码特别简单,我们就不讨论了!

  今天我们要讨论的是,单例模式的扩展,也就是要求返回指定数量的实例,这个应该怎么实现呢?废话不多说,直接来代码分析!

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using System.Threading.Tasks;
 7
 8 namespace designpattrns_SingleModelEx
 9 {
10
11     /// <summary>
12     /// cto类负责产生CTO
13     /// </summary>
14
15     public class cto
16     {
17         private static int maxnumofcto = 5; //申明返回的实例数量
18
19         private static List<string> ctolistprop = new List<string>(); //每个cto都有自己的属性,因此用来存储每个对象私有属性
20
21         private static List<cto> ctolist  //默认申请指定数量的CTO对象存储
22         {
23             get
24             {
25                 List<cto> ctolisttemp = new List<cto>();
26                 for (int i = 0; i < maxnumofcto; i++)
27                 {
28                     ctolisttemp.Add(new cto($"我是CTO,我的名字是{i}"));
29                 };
30                 return ctolisttemp;
31             }
32         }
33
34         private static int countnumofcto = 0;//申明cto的的序列号,便于后边区分
35
36         //不让用户程序员自己随便new对象,否则容易产生多个CTO
37         //同时把生产指定数量的对象放入数组中
38         private cto()
39         {
40
41         }
42
43         /// <summary>
44         /// 用来存储CTO的姓名
45         /// </summary>
46         /// <param name="name"></param>
47         private cto(string name)
48         {
49             ctolistprop.Add(name);
50         }
51
52
53         /// <summary>
54         /// 单例模式的核心
55         /// </summary>
56         /// <returns></returns>
57         public static cto getInstance()
58         {
59             /*下面的核心从cto队列中随机返回一个CTO对象*/
60             Random random = new Random();
61             countnumofcto = random.Next(maxnumofcto);
62             return ctolist[countnumofcto];
63         }
64
65
66         public void Say()
67         {
68             Console.WriteLine($"我是公司的CTO{ctolistprop[countnumofcto]},你们的工作需要想问汇报!");
69         }
70     }
71
72     class Program
73     {
74         static void Main(string[] args)
75         {
76             for (int j = 0; j < 10; j++)
77             {
78                 cto CTO = cto.getInstance(); //获取cto实例,并且每次返回都随机的
79                 Console.WriteLine($"第{j}次调用的对象为:");
80                 CTO.Say();
81                 Thread.Sleep(1000);//暂停目的,不暂停的话,在返回实例的时候有可能每次返回的都是同一个实例,因为时间间隔小的随机数生产可能相同
82             }
83         }
84     }
85 }

上面的代码清晰明了的说明了单例模式的扩展功能,返回指定数量的实例对象是对单例模式的一种扩展和增强,用来弥补单例模式可能存在的性能问题,有了上述的方法,我们可以自由决定对象在内存中的数量,相对于单例模式,提高了系统的响应速度!

好了以上就是我们今天要分享的单例模式的升级版本,下一章,我们继续分享下一个设计模式---工厂方法模式!

代码已上传至github了,代码地址:https://github.com/hyy829119/DesignPatterns.git

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

时间: 2024-09-29 06:05:26

设计模式-单例模式扩展(程序员学习之路-架构之路)的相关文章

西二旗程序员家庭装修的架构之路 - 1

在北京,有这么一个神奇的地方---西二旗,这里坐落着中国最知名的IT公司群体:广联达,腾讯,百度,网易,新浪,联想,甲骨文,IBM,--(未来还会有大鸟软件:www.bigbird.wang,啊哈哈哈--). 工作生活在这里的一群人--旗人!区别三里屯的"屯儿里的人",亦庄的"庄儿里的人",中关村的"村儿里的人",这群人有点精神分裂,有点完美主义强迫症,很可爱,也很多金,却不似寻常之人,自成一体. 这群人爱看博客,爱写博客,爱把听到的,见到的一切

西二旗程序员家庭装修的架构之路 - 3(流程)

很多人存在一种误解,认为选择一个好的家装公司就会有一个满意的家装结果.实际上,这是不正确的. 满意的家装是由效果+质量两个方面决定的.根据我的实践总结:效果(家装风格)取决于业主自己和设计师,质量取决于工长和工人,家装公司仅仅起到一个托底的作用. 家装有点类似一件绘画作品的创建:绘画作品的美丑其实在业主和设计师的构想决定那一刻就固定下来了,画工的精细则依靠工长的工序安排和工人的施工手艺,家装公司则负责提供好的画笔,好的纸张和好的颜料. 但是,很多业主往往忽略了设计图的重要性,在前期沟通过程中,对

Java程序员学习之路

1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基本没有其它任何一本书可以超越它.该书的作者Bruce Eckel在网络上被称为天才的投机者,作者的<Thinking in C++> 在1995年曾获SoftwareDevelopment Jolt Award最佳书籍大奖,<Thinking in Java>被评为1999年Java

Android程序员学习之路

和一些刚工作以及未毕业的同学沟通,很多同学对在没有工作机会或熟练Android人员指导的情况下,如何学习Android并提高Android水平比较关心.下面我从几个方面介绍一些方法和方式来和大家分享: 1.Android知识 1.1.网站资源 1.1.1.Android官网 这个是最权威最官方的.主要看设计篇 和开发篇 .API相关接口用到哪一个接口再去看.不用挨个看.当然现在可能会被墙,大家也可以看本地SDK目录下的docs中的index.html打开后的文档. 1.1.2.stackover

从1.5k到18k, 一个程序员的5年成长之路

http://blog.csdn.net/lgg201/article/details/8637763 昨天收到了心仪企业的口头offer, 回首当初什么都不会开始学编程, 到现在恰好五年. 整天在社区晃悠, 看了不少的总结, 在这个时间点, 我也写一份自己的总结吧. 我一直在社区分享, 所以, 这篇总结也是本着一种分享的态度, 希望相比我还年轻的同学们, 可以从中找到一些让自己成长更快的文字. 先介绍下背景:1. 2008年3月开始学习编程, 目前2013年3月;2. 2009年6月计算机专业

聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路

阿里社招面试都问什么? 和之前一样,文章一上来,我们先来谈谈阿里的社招面试都问什么,其实这个话题并不是什么秘密,所有来阿里面试过的同学,都能回答一二. 两年前的时候,笔者在文章里是这么回答的. 这个是让LZ最头疼的一个问题,也是群里的猿友们问的最多的一个问题. 说实话,LZ只能隐约想起并发.JVM.分布式.TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住.而且就算LZ记住了,也告诉你了,你也背会了,但LZ觉得,在面试中,你被问到一模一样问题的可能性依然很小. 甚至,就算你运气好被问到了

各类程序员学习路线图

各类程序员学习路线图 各类程序员学习路线图 程序猿是一种非常特殊的.可以从事程序开发.维护的动物.一般分为程序设计猿和程序编码猿,但两者的界限并不非常清楚,都可以进行开发.维护工作. 前端工程师 基础:HTML教程,CSS教程 进阶:Javascript,jQuery 高级:AJAX 教程,JSON 教程,XML 教程 框架扩展学习:Bootstrap 教程,jQuery UI 教程,jQuery EasyUI 教程,jQuery Mobile 教程 调试工具:Firebug 教程 开发工具:H

Net程序员学习Linux

Net程序员学习Linux 本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 为什么学习linux? 1.很多人都说.net程序员只会在Windows的环境下进行工作,压根就不懂Linux的使用,也不懂Linux的命令,只会用鼠标,只会在图形界面下工作.其实刚开始听,心里挺不爽的,作为一个.net程序员,我所熟悉的当然是在windows下工作,因为我们压根不需要在linux

优秀游戏程序员学习资料推荐

这两天给单位的技术做的一次学习材料推荐培训,直接ppt上拷过来的. 优秀游戏程序员学习资料推荐 主讲人:臧旭 前言 今天提到的纯粹是我个人心得和理解,可能片面,可能以偏概全. 目的是给大家做一定的指引作用,想让大家知道自己还有哪些可以去学习,还有哪些不足,我们距离优秀还有多远. 对我今天提到的东西,如果大家有时间,一定要去深入了解,在技术的道路上才有可能看得远.走得稳.飞得高. 另外有一句对所有技术人员想说的话: 学无止境.切忌坐井观天.有一点小小的成就就沾沾自喜.止足不前. 扎实的基础 万丈高