一、单例模式(Singleton)
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
特点:一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
一、经典实现
using System; namespace SingletonPattern
{
// 经典写法
// sealed 阻止其他类从该类继承
public sealed class ClassicalSample
{
// 用来保存唯一实例
private static ClassicalSample _classicalSample;
// 锁范围
private static readonly object obj = new object(); // 私有构造函数,阻止外部new实例化
private ClassicalSample()
{
Console.WriteLine("实例化");
} // 统一该类的
public static ClassicalSample GetInstance()
{
// 减少锁的开销
if (_classicalSample == null)
{
// 防止多线程并发
lock (obj)
{
//
if (_classicalSample == null)
{
_classicalSample = new ClassicalSample();
}
}
} Console.WriteLine("获取实例"); return _classicalSample;
}
}
}
二、静态构造函数实现
using System; namespace SingletonPattern
{
public sealed class StaticConstructorSample
{
private static StaticConstructorSample _staticConstructorSample; private StaticConstructorSample()
{
Console.WriteLine("实例化");
} // 静态构造函数:第一次使用的时候执行,且只执行一次
static StaticConstructorSample()
{
_staticConstructorSample = new StaticConstructorSample();
Console.WriteLine("静态构造函数实例化");
} public static StaticConstructorSample GetInstance()
{
Console.WriteLine("获取实例");
return _staticConstructorSample;
}
}
}
三、静态变量实现
using System; namespace SingletonPattern
{
public sealed class StaticVariableSample
{
private static readonly StaticVariableSample _StaticVariableSample = new StaticVariableSample(); private StaticVariableSample()
{
Console.WriteLine("实例化");
} public static StaticVariableSample GetInstance()
{
Console.WriteLine("获取实例");
return _StaticVariableSample;
}
}
}
测试:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace SingletonPattern
{
class Program
{
static void Main(string[] args)
{
ClassicalSampleTest(); StaticConstructorSampleTest(); StaticVariableSampleTest(); Console.Read();
} static void ClassicalSampleTest()
{
Console.WriteLine("经典单例模式测试"); TaskFactory taskFactory = new TaskFactory(); // 多线程测试的task组
List<Task> tasks = new List<Task>();
// 每个线程获取实例集
List<ClassicalSample> list = new List<ClassicalSample>(); for (int i = ; i < ; i++)
{
tasks.Add(taskFactory.StartNew<ClassicalSample>(() => ClassicalSample.GetInstance()).ContinueWith((r) =>
{
list.Add(r.Result);
}));
} taskFactory.ContinueWhenAll(tasks.ToArray(), p =>
{
Console.WriteLine("");
Console.WriteLine("tasks组执行完成之后一共获取了{0}次实例", p.Count()); Console.WriteLine("实例个数{0}", list.Distinct().Count());
});
} static void StaticConstructorSampleTest()
{
Console.WriteLine("静态构造函数单例模式测试"); TaskFactory taskFactory = new TaskFactory(); // 多线程测试的task组
List<Task> tasks = new List<Task>();
// 每个线程获取实例集
List<StaticConstructorSample> list = new List<StaticConstructorSample>(); for (int i = ; i < ; i++)
{
tasks.Add(taskFactory.StartNew<StaticConstructorSample>(() => StaticConstructorSample.GetInstance()).ContinueWith((r) =>
{
list.Add(r.Result);
}));
} taskFactory.ContinueWhenAll(tasks.ToArray(), p =>
{
Console.WriteLine("");
Console.WriteLine("tasks组执行完成之后一共获取了{0}次实例", p.Count()); Console.WriteLine("实例个数{0}", list.Distinct().Count());
});
} static void StaticVariableSampleTest()
{
Console.WriteLine("静态变量单例模式测试"); TaskFactory taskFactory = new TaskFactory(); // 多线程测试的task组
List<Task> tasks = new List<Task>();
// 每个线程获取实例集
List<StaticVariableSample> list = new List<StaticVariableSample>(); for (int i = ; i < ; i++)
{
tasks.Add(taskFactory.StartNew(() => StaticVariableSample.GetInstance()).ContinueWith((r) =>
{
list.Add(r.Result);
}));
} taskFactory.ContinueWhenAll(tasks.ToArray(), p =>
{
Console.WriteLine("");
Console.WriteLine("tasks组执行完成之后一共获取了{0}次实例", p.Count()); Console.WriteLine("实例个数{0}", list.Distinct().Count());
});
}
}
}
一、单例模式(Singleton)的更多相关文章
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- ooad单例模式-Singleton
单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...
- iOS单例模式(Singleton)写法简析
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- 浅谈设计模式--单例模式(Singleton Pattern)
题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...
- 设计模式之——单例模式(Singleton)的常见应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- 设计模式之单例模式(Singleton Pattern)
单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...
- 设计模式(4) -- 单例模式(Singleton)
设计模式(4) -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...
- IOS单例模式(Singleton)
IOS单例模式(Singleton) 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...
- java设计模式之 单例模式 Singleton
static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...
随机推荐
- Tensorflow知识点学习
1.TensorFlow中Tensor维度理解: (1)对于2维Tensor 0维对应列 1维对应行 (2)维度操作举例: 对于k维的,tf.reduce_sum(x, axis=k-1)的结果是对最 ...
- POJ3580:SuperMemo
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...
- AI-Info-Micron-Insight:案例分析:美光使用数据和人工智能来发现、倾听和感觉
ylbtech-AI-Info-Micron-Insight:案例分析:美光使用数据和人工智能来发现.倾听和感觉 1.返回顶部 1. 案例分析:美光使用数据和人工智能来发现.倾听和感觉 内存芯片制造商 ...
- jsonp实现数据跨域请求
1.我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的. 远程服务器remoteserver.com根目录下有个remote.js文件代码如下: al ...
- failed to create rwlayer: lstat /var/lib/docker/overlay2/ no such file or directory
在使用Docker构建微服务镜像时出现的错误.第一天构建好好的,第二天就出现了这样的错误.通过百度这条错误的信息非常少,只在 stackoverflow.com 上找到一条,问题指向了 dockerf ...
- Hive与表操作有关的语句
Hive与表操作有关的语句 1.创建表的语句: Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COM ...
- unix环境高级编程附录 B 通用代码
0.说明: 在测试 unix 环境高级编程中的代码时,需要一些作者事先写好的代码, 如: apue.h 包含某些标准系统头文件,定义许多常量及函数原型 还有两个作者自编的函数来对错误进行处理 1.ep ...
- Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析
Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析 一.加载数据 import pandas as pd import numpy as np url = ('http ...
- Java8函数式接口之Predicate<T>
作用: 这是一个功能接口,因此可以作为lambda表达式或方法引用的赋值目标. 实例: /** * Created by luo on 2017/5/3. */ public class Predic ...
- Vue实现一个MarkDown编辑器
Vue实现一个markdown编辑器 前段时间做项目的时候,需要一个Markdown编辑器,在网上找了一些开源的实现,但是都不满足需求 说实话,这些开源项目也很难满足需求公司项目的需求,与其实现一个大 ...