C#设计模式:单例模式(Singleton)
一,单例模式:它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个,就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。
1,静态方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace SingletonPattern
{
public class Singleton
{
private Singleton()
{
Console.WriteLine("{0}被创建了,线程ID{1}!", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
} public static Singleton _singleton = null;
public static object lockObject = new object();
/// <summary>
///创建实例
/// </summary>
/// <returns></returns>
public static Singleton CreateIntance()
{
if (_singleton == null) //保证对象初始化之后的所有线程,不需要等待锁
{
Console.WriteLine("准备进入Lock");
lock (lockObject) //保证只有一个进程去判断
{
if (_singleton == null) //保证为空才正的创建
{
_singleton = new Singleton();
}
}
}
return _singleton;
} public void Show()
{
Console.WriteLine("显示!!!");
}
}
}
2,静态构造单例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace SingletonPattern
{
public class SingletonSecond
{
public static SingletonSecond _singleton = null;
private SingletonSecond()
{
Console.WriteLine("{0}被创建了,线程ID{1}!", this.GetType().Name,Thread.CurrentThread.ManagedThreadId);
}
/// <summary>
///1,静态构造函数:由CLR保证,再第一次使用这个类型之前,调用而且之调用一次
/// </summary>
/// <returns></returns>
static SingletonSecond()
{
_singleton = new SingletonSecond();
}
public static SingletonSecond CreateIntance()
{
return _singleton;
} public void Show()
{
Console.WriteLine("显示!!!");
}
}
}
3,静态变量单例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace SingletonPattern
{
public class SingletonThird
{ private SingletonThird()
{
Console.WriteLine("{0}被创建了,线程ID{1}!", this.GetType().Name,Thread.CurrentThread.ManagedThreadId);
}
/// <summary>
/// 静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
/// </summary>
private static SingletonThird _singleton = new SingletonThird();
public static SingletonThird CreateIntance()
{
return _singleton;
} public void Show()
{
Console.WriteLine("显示!!!");
}
}
}
4,输出结果
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace SingletonPattern
{
/// <summary>
/// 单例模式
/// 保证整个进程中该对象只被实例化一次,常驻内存,根据这个特点:单例模式有三种写法:Singleton,SingletonSecond,SingletonThird,
/// 普通的类型是需要的时候初始化,使用完被GC回收,跟静态不一样
/// </summary>
class Program
{
static void Main(string[] args)
{
//Singleton singleton = Singleton.CreateIntance();
//for (int i = 0; i < 10; i++)
//{
// Singleton singleton = Singleton.CreateIntance();
// singleton.Show();
//}
Console.WriteLine("---------------------------------------");
//多线程测试调用,结果也是公用一个对象,之调用一次构造函数
List<IAsyncResult> asyncResults = new List<IAsyncResult>();
for (int i = ; i < ; i++)
{
asyncResults.Add(new Action(() =>
{
Singleton singleton = Singleton.CreateIntance();
singleton.Show();
}).BeginInvoke(null,null)); //会启动一个异步多线程的调用
} ////判断多线程是否执行完了
while (asyncResults.Count(r => !r.IsCompleted) > )
{
Thread.Sleep();
} Console.WriteLine("---------------------------------------");
//多线程测试调用,结果也是公用一个对象,之调用一次构造函数
List<IAsyncResult> asyncResults2 = new List<IAsyncResult>();
for (int i = ; i < ; i++)
{
asyncResults2.Add(new Action(() =>
{
SingletonSecond singleton = SingletonSecond.CreateIntance();
singleton.Show();
}).BeginInvoke(null, null)); //会启动一个异步多线程的调用
} ////判断多线程是否执行完了
while (asyncResults2.Count(r => !r.IsCompleted) > )
{
Thread.Sleep();
} Console.WriteLine("---------------------------------------");
List<IAsyncResult> asyncResults3 = new List<IAsyncResult>();
for (int i = ; i < ; i++)
{
asyncResults3.Add(new Action(() =>
{
SingletonThird singleton = SingletonThird.CreateIntance();
singleton.Show();
}).BeginInvoke(null, null)); //会启动一个异步多线程的调用
}
Console.ReadKey();
}
}
}

得到的结果都是一样的,共有对象,都是被构造一次
二,单例模式的扩展
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _1_2单例模式
{
class Program
{
static void Main(string[] args)
{
Demo.Instance.Say();
}
} public class SingleTon<T> where T : new()
{
private static T _instance;
public static T Instance
{
get { return _instance = new T(); }
}
} public class Demo : SingleTon<Demo>
{
public void Say()
{
Console.WriteLine("单例模式");
}
}
}
三:单例模式(Singleton)的特点
1,私有构造函数,原因使用者不可以实例,则单例模式全局只有一个实例
2,静态实例,因为静态变量的生命周期跟整个应用程序的生命周期是一样的,所以定义一个私有的静态全局变量instance来保存该类的唯一实例;
3,单例模式避免多线程并发造成实例并不唯一,则需要用到锁。锁的解析如以上代码。
C#设计模式:单例模式(Singleton)的更多相关文章
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
- 浅谈设计模式--单例模式(Singleton Pattern)
题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...
- [工作中的设计模式]单例模式singleton
一.模式解析: 单例模式是最简单和最常用的设计模式,面试的时候,不管新毕业的学生还是已经工作多年的筒子,对单例模式基本都能聊上两句.单例模式主要体现在如下方面: 1.类的构造函数私有化,保证外部不能直 ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- 设计模式--单例模式Singleton(创建型)
单例模式很显然是定义一个类,这个类在程序中只有唯一的实例对象.一般单例类的构造函数是私有的,只能通过调用静态函数GetInstance来获取实例. 一.单例模式有三种:懒汉式单例.饿汉式单例.登记式单 ...
- 设计模式--单例模式Singleton
单例模式顾名思义整个程序下只有一个实例,例如一个国家只有一个皇帝,一个军队只有一个将军.单例模式的书写又分为饿汉模式和懒汉模式 饿汉模式 类中代码 package demo; public cla ...
- 设计模式——单例模式(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点.——DP UML类图 模式说明 个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类.这个模 ...
- 设计模式-单例模式(Singleton) (创建型模式)
//以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...
随机推荐
- 原生JS实现图片循环切换
<!-- <!DOCTYPE html> <html> <head> <title>原生JS实现图片循环切换 —— 方法一</title&g ...
- linux下的mongodb的备份与恢复
mongodb的备份有两种方式: 1.直接拷贝数据目录下的一切文件 2.使用mongodump方式 3.主从复制:http://www.cnblogs.com/huangxincheng/archiv ...
- [Luogu2014]选课(树形dp)
[Luogu2014]选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课 ...
- 前端 js javascript
新浪SAE公共资源 推荐指数★★★ 支持https http://lib.sinaapp.com/http://lib.sinaapp.com/js/jquery/2.0.3/jquery-2.0.3 ...
- 2018-10-25-weekly
Algorithm 94. 二叉树的中序遍历 What 给定一个二叉树,返回它的中序遍历. How 二叉树的中序遍历顺序为左-根-右,可以用递归来解,对左子结点调用递归函数,根节点访问值,右子节点再调 ...
- shiro框架在springboot项目中的应用
地址:https://blog.csdn.net/taojin12/article/details/88343990 地址2:https://blog.csdn.net/bicheng4769/art ...
- 简单的使用redis
心不慌手不抖我们跟着大哥走 https://blog.csdn.net/zhangcongyi420/article/details/82686702
- linux运维、架构之路-ansible批量管理
一.ansible软件 1.介绍 ①ansible是一个基于Python开发的自动化运维工具 ②其功能实现基于SSH远程连接服务 ③ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量 ...
- 微信公众号号开发(Java)
参考:http://www.cnblogs.com/fengzheng/p/5023678.html http://www.cnblogs.com/xdp-gacl/p/5151857.html 一: ...
- HDU | 1874 畅通工程续 SPFA&DIJIESITLA
题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰 ...