【.Net边角料系列】1-单例模式(我真不是你想的那样)
- 什么事边角料?
边角料就是你编程的时候,很少能够用上,或者说你压根就不知道得东西,我就称这些东西为边角料。这个叫.net边角料可能有点大,其实这个系列是纯粹的C#边角料系列。
为什么写.net边角料呢,因为.net coder越来越少了,所以边角的东西,知道的人也越来越少,虽然价值不大,但是要抱着抛砖引玉的思想,把更多的人留在.net上,助力.net core红红火火大发展——之后我好转其他语言。就是这种拉一个人下水是一个,俩个人下水赚一个的精神支持着我,希望我能把.net边角料系列写完。我不是代码的生产者,只是代码的搬运工,所以对于边角料出现的代码如果有开源代码地址,我一定会将开源代码位置附上,以供下水者沉迷其中,不能自拔。
- 边角料的单例模式
如果说单例模式是边角料,估计我会挨喷,基本每次面试都可能被问到,而且不懂单例模式,好意思说自己是一个.net程序员吗?所以咱们这谈的不是传统的单例模式,更不会谈什么线程安全性,以及懒加载、惰性加载的问题。
不过也得问一句,单例模式符合设计模式的六大原则吗?至少单一职责原则,它不符合。它既要保证自己单例又要保证自己原有意义。设计模式上没有什么是拆分办不到的,如果办不到,那就再拆分一次。
所以下面我们正式介绍我们的边角料——泛型单例
- 源码及地址
没有什么比源码更有说服力了,首先上源码地址:nopCommerce(https://github.com/nopSolutions/nopCommerce)这个是大名鼎鼎的nopCommerce,具体它有多牛,自行百度,反正我也不知道。类文件叫做:Singleton.cs
public class Singleton<T> : Singleton
{
static T instance;
public static T Instance
{
get { return instance; }
set
{
instance = value;
AllSingletons[typeof(T)] = value;
}
}
} public class SingletonList<T> : Singleton<IList<T>>
{
static SingletonList()
{
Singleton<IList<T>>.Instance = new List<T>();
}
public new static IList<T> Instance
{
get { return Singleton<IList<T>>.Instance; }
}
} public class SingletonDictionary<TKey, TValue> : Singleton<IDictionary<TKey, TValue>>
{
static SingletonDictionary()
{
Singleton<Dictionary<TKey, TValue>>.Instance = new Dictionary<TKey, TValue>();
} public new static IDictionary<TKey, TValue> Instance
{
get { return Singleton<Dictionary<TKey, TValue>>.Instance; }
}
} public class Singleton
{
static Singleton()
{
allSingletons = new Dictionary<Type, object>();
} static readonly IDictionary<Type, object> allSingletons; public static IDictionary<Type, object> AllSingletons
{
get { return allSingletons; }
}
}
- 代码分析
单例模式就是设计模式最最简单的了,泛型单例也是简单到令人发指。代码分析有什么说的呢,不过为了凑篇幅,强说两句吧。
1.这里面一共有四个类:Singleton、Singleton<T>、SingletonList<T>、SingletonDictionary<TKey, TValue>。继承关系是Singleton<T>集成自Singleton,而SingletonList<T>、SingletonDictionary<TKey, TValue>继承自Singleton<T>.
对于不熟悉泛型的同学来说,我可以拍胸脯的告诉你,泛型类可以继承自非泛型类,非泛型类可以继承自泛型类,只要你想没啥不可以的。
2.对于这四个类,所有内容都是静态的——构造函数、字段、属性。对于静态构造函数,这个和普通构造函数不同的地方有三:首先它只用于初始化静态变量,其次静态构造函数不供其他类调用(所以不能用public、private修饰),只够clr初始化的时候调用。最后静态构造函数不能有参数列表,因为没人能给它传参。
3.对于泛型来说,List<int>和List<string>是俩个完全不同的类,所以尽管SingletonList<T>只有一个静态变量,但是对于已经非泛化(具体类型代入后)的各个类型,都有自己的静态变量,所以每个T类型都对应SingletonList<T>的Instance属性,所以泛型类能够保证每个实例都能是全局唯一——也就是单例模式。
4.对于Singleton非泛型类,他唯一的作用就是提供一个集合,供其他对象检索,哪些类型已经被泛型单例类缓存了。这完全不是必须的。但是他给我们提了一个醒:对于非泛型类每个类单独所有的静态变量,要放到泛型类的父类中。换句话说,就是泛型类出现静态变量要慎重,是不是要放到父类中。
- 实用的代码
泛型单例这段源码,虽然高大上,但是不一定符合我们的要求,所以我们有时候有实用的要求,下面就供上我简化的泛型单例源码.
public class Singleton<T> where T:new()
{
static T instance=new T();
public static T Instance
{
get { return instance; }
set
{
instance = value;
}
}
}
- 说到最后
虽然泛型单例确实是边角料,但是泛型、静态构造函数、以及nopCommerce绝对不是边角料。愿这些似是而非的边角料,对你有益。
【.Net边角料系列】1-单例模式(我真不是你想的那样)的更多相关文章
- 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性
模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...
- Java设计模式系列之单例模式
单例模式的定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供.比如,多程序读取一个配置文件时,建议配置文件时,建议配置文件封装成对象.会方便操作其中的数据,又要保证多个程序读到的是同一个配置文 ...
- [js高手之路]设计模式系列课程-单例模式实现模态框
什么是单例呢? 单,就是一个的意思.例:就是实例化出来的对象,那合在一起就是保证一个构造函数只能new出一个实例,为什么要学习单例模式呢?或者说单例模式有哪些常见的应用场景.它的使用还是很广泛,比如: ...
- 【Android Studio安装部署系列】七、真机运行项目
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 简单介绍下真机运行项目的操作步骤. 手机连接电脑 将手机通过数据线连接到电脑上,此时电脑会自动下载安装驱动程序.如果没有安装上的话, ...
- 设计模式总结篇系列:单例模式(SingleTon)
在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式.适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象.如Android中常见的Application对象. ...
- 设计模式系列之单例模式(Singleton Pattern)
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式涉及到一个单一的类,该类负责创建自己的对象 ...
- DesignPattern系列__10单例模式
单例模式介绍 单例模式,是为了确保在整个软件体统中,某个类对象只有一个实例,并且该类通常会提供一个对外获取该实例的public方法(静态方法). 比如日志.数据库连接池等对象,通常需要且只需要一个实例 ...
- 【iOS系列】-单例模式的实现
1:重写allocWithZone方法 allocWithZone方法是对象分配内存空间时, alloc方法最终会调用这个方法 + (id)allocWithZone:(struct _NSZone ...
- LeetCode 笔记系列八 Longest Valid Parentheses [lich你又想多了]
题目:Given a string containing just the characters '(' and ')', find the length of the longest valid ( ...
随机推荐
- 近期对FTP及Excel数据处理的一些摸索
一个多月没写随笔了,主要是发的东西,自己感觉也很垃圾,说又说回来,谁不是从垃圾变强的,所以不比比,还得努力.come on!! Python学习也有段时间了,近期为了解决同事的一个难题,所以我们决定联 ...
- ResourceBundle读取文件学习
开发中,我们经常需要读取本地文件(properties文件),这样的好处是文件是动态的,可配置的.这时候我们就需要用到ResourceBundle这个类. 这个类属于java.util.*. 这个类的 ...
- mysql 常用sql语句 二
mysql 查询 基本查询 select * from users; 去重 select distinct(name),high from users order by high desc; ## 注 ...
- 分布式系统的消息&服务模式简单总结
分布式系统的消息&服务模式简单总结 在一个分布式系统中,有各种消息的处理,有各种服务模式,有同步异步,有高并发问题甚至应对高并发问题的Actor编程模型,本文尝试对这些问题做一个简单思考和总结 ...
- 配置java项目的intellij idea的运行环境
才疏学浅,只懂一点点前端的皮毛东西,对于项目运行环境的配置一无所知,今天简单记录一下! 前提:装好了jdk.maven.intellij idea. 1. file菜单->Open...打开从S ...
- SQL 杂活
例子一:查询两个表数据并且分页展示 select * from ( select ROW_NUMBER() OVER(order by CreateTime desc) as rownum,* fro ...
- iOS pch文件创建使用,和info.plis文件路径改变,路径的设置
一 路径报错: 二 pch创建设置: 一:如果要更改Info.plist与Prefix.pch文件实际路径,也就是实际文件的位置(不是在工程中的组织路径),需要到Build Settings中修改对应 ...
- Python 项目实践二(下载数据)第三篇
接着上节继续学习,在本章中,你将从网上下载数据,并对这些数据进行可视化.网上的数据多得难以置信,且大多未经过仔细检查.如果能够对这些数据进行分析,你就能发现别人没有发现的规律和关联.我们将访问并可视化 ...
- Oracle数据库部分迁至闪存存储方案
Oracle数据库部分迁至闪存存储方案 1.实施需求 2.确认迁移表空间信息 3.确认redo信息 4.确认undo信息 5.表空间迁移到闪存 6.redo迁移到闪存 7.undo迁移到闪存 8.备库 ...
- vue 和 react 学习 异同点
vue 和 react 学习 异同点 本文不做两个框架比较,只对比了两个框架的语法对比,不代表任何观点,盗版必究,本人唯一qq:421217189 欢迎大家一起来学习探讨,壮我大前端(本文markdo ...