23种设计模式--单例模式-Singleton
一、单例模式的介绍
单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之一,面试经常会问答,所以我们在程序考虑什么地方会用到单例模式,单例模式写法有很多种,这里我下面列举2种写法很普遍的写法,然后做个多线程计数的例子大家来理解一下单例模式的用法。
二、单例模式Demo
/// <summary>
/// 利用C#的特性单例模式
/// </summary>
public sealed class SampleSingleton1
{
private int m_Counter = 0;
private SampleSingleton1()
{
Console.WriteLine("初始化SampleSingle1");
}
public static readonly SampleSingleton1 singleton = new SampleSingleton1();
/// <summary>
/// 调用次数计数器
/// </summary>
public void Counter()
{
m_Counter++;
}
}
/// <summary>
/// 线程安全的单例模式
/// </summary>
public class SampleSingleton2
{
private static volatile SampleSingleton2 m_Instance = null;
private int m_Counter = 0;
private SampleSingleton2()
{
Console.WriteLine("初始化SampleSingleton2.");
}
public static SampleSingleton2 Singleton
{
get
{
if (m_Instance == null)
{
lock (typeof(SampleSingleton2))
{
if (m_Instance == null)
{
m_Instance = new SampleSingleton2();
}
}
}
return m_Instance;
}
}
/// <summary>
/// 调用计数器
/// </summary>
public void Couter()
{
m_Counter++;
}
}
/// <summary>
/// 测试2种模式的效率和调用的方式
/// </summary>
DateTime milestone;
int maxCallTimes= 100000000;
// 第一次调用SampleSingleton1的Counter方法
Console.WriteLine("第一次调用SampleSingleton1的Counter方法");
SampleSingleton1.singleton.Counter();
// 计算10000次调用的耗费时间
milestone = DateTime.Now;
for (int i = 0; i < maxCallTimes; i++)
{
SampleSingleton1.singleton.Counter();
}
Console.WriteLine(maxCallTimes.ToString() + "次调用执行时间为:" + ((TimeSpan)(DateTime.Now - milestone)).TotalMilliseconds.ToString());
Console.WriteLine("");
// 第一次调用SampleSingleton2的Counter方法
Console.WriteLine("第一次调用SampleSingleton2的Counter方法");
SampleSingleton2.Singleton.Couter();
// 计算10000次调用的耗费时间
milestone = DateTime.Now;
for (int i = 0; i < maxCallTimes; i++)
{
SampleSingleton2.Singleton.Couter();
}
Console.WriteLine(maxCallTimes.ToString() + "次调用执行时间为:" + ((TimeSpan)(DateTime.Now - milestone)).TotalMilliseconds.ToString());
string str = Console.ReadLine();
}
三、GitHub的地址
https://github.com/wangtongzhou520/Designpattern
23种设计模式--单例模式-Singleton的更多相关文章
- GOF 23种设计模式-单例模式
• 创建型模式: – 单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式. • 结构型模式: – 适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模 式. • 行为型模式: – ...
- 23种设计模式 - 对象性能(Singleton - Flyweight享元)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象性能 面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价.对于通常情 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java开发中的23种设计模式(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- c#中的23种设计模式
C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- JAVA:23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- python3 threading初体验
python3中thread模块已被废弃,不能在使用thread模块,为了兼容性,python3将thread命名为_thread.python3中我们可以使用threading进行代替. threa ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- 简单入门canvas - 通过刮奖效果来学习
一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...
- 解决Android Studio 无法显示Layout视图问题
在Android Studio 当中,如果你选择的SDK的版本 与你所显示的视图版本不一致时,会出现这个错误 Exception raised during rendering:com/android ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
- Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决
在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...
- 在Linux配置Nginx web服务器步骤
系统环境:centos7 需要软件:nginx-1.3.16.tar.gz libevent-2.0.21-stable.tar.gz Pcre 和 pcre-devel nginx下载地址:h ...
- LeetCode - Two Sum
Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...