创建型模式篇(单例模式Single Pattern)
一、单例模式(Singleton Pattern)
单例模式要求一个类只能有一个实例,并且提供了一个全局的访问点。
比如说,中国主席的职位是Singleton,法律规定主席选举,任何时间只能有一个主席。
1、逻辑模型图:
2、物理模型图:
3、具体实现:
3.1、懒汉式单例:
//懒汉式单例
public sealed class Singleton//类设置属性为密封,不能被继承。
{
static Singleton instance=null;
Singleton()
{} public static Singleton Instance
{
get
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
}
//这种实现方式,不是线程安全的,因为多线程的时候,可能会得到Singleton类的多个实例。
//假如有两个线程都去判断if(instance==null)并且得到结果为true,这时两个线程
//都会创建类Singleton的实例,违背了单例模式只能有一个类对象的实例的原则。
3.2、线程安全的单例
public sealed class Singleton
{
static Singleton instance=null;
static readonly object padlock=new object();//进程辅助对象 Singleton()
{ } public static Singleton Instance
{
get
{
lock(padlock)
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
}
}
//对于线程来说是安全的,首先创建了一个进程的辅助对象,线程进入时先对padlock加锁
//然后在检测对象是否被创建,这样可以确保只有一个实例被创建,而且加入了锁,导致程序只有
//一个线程可以进去,对象实例有最先进入的那个线程创建,后面进来的线程进入时if(instance==null)为false
//不会再去创建对象实例,这种方式增加了额外的开销,损失了性能。
3.3、双重锁定
public sealed class Singleton
{
static Singleton instance=null;
static readonly object padlock=new object(); Singleton()
{ } public static Singleton Instance
{
get
{
if(instance==null)
{
lock(padlock)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
}
//对于多线程是安全的,而且并不是线程每次都加锁,只有判断对象实例没有被创建的时候才会加锁
//加锁还再进行对象是否被创建的判断。解决了线程并发的问题,但是实际上需要这样实现,大多数我们会
//使用静态初始化,但是静态初始化有自己的缺点,无法实现延迟初始化
3.4、静态初始化
public sealed class Singleton
{
static readonly Singleton instance=new Singleton();
//静态初始化的无参构造方法
static Singleton()
{ } Singleton()
{ } public static Singleton Instance
{
get
{
return instance;
}
}
}
//类标记为sealed不能继承,因为继承可能会增加实例。
//变量标记为readonly,表示只能在静态初始化时候或者在构造方法中分配变量。
3.5、延迟初始化
//如果类,结构,代理,枚举是外置,那么修饰符只有public和internal,默认是internal
//如果是内置的,修饰符默认是private
//举例: class A{}//类A是internal,internal表示同一个程序集中所有代码都可以访问类型或者成员
//其他程序集不可以访问。
//举例:class A
// {
// class B{}//类B是private
// }
public sealed class Singleton
{
Singleton()//类的构造函数默认为private
{ } public static Singleton Instance
{
get
{
return Lazy.instance;
}
} class Lazy//lazy默认是internal
{
static Lazy()
{ }
internal static readonly Singleton instance=new Singleton();
} }
//初始化的时候有一个Lazy类的一个静态成员来完成,这样实现了延迟初始化。
4、实现总结:
Singleton单例模式构造方法可以设置为protected,允许子类继承。
单例模式不要支持实例化,可能导致多个对象实例,也不要支持Icloneable接口,导致多个对象的实例,单例模式只考虑了对象创建的管理,没有考虑对象销毁的管理,支持垃圾回收的平台的对象的开销来讲,没必要对其销毁进行特殊的管理。
理解:Singleton模式核心:如何控制用户使用new对一个类的构造方法任意调用。
创建型模式篇(单例模式Single Pattern)的更多相关文章
- java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...
- 创建型模式篇(工厂模式Factory Pattern)
一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...
- Java设计模式(4)——创建型模式之单例模式(Singleton)
一.概述 弥补一下之前没有给设计模式下的定义,先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计 ...
- Python版设计模式: 创建型模式:单例模式和工厂模式家族
一. 单例模式(Singleton) 所谓单例模式,也就是说不管什么时候都要确保只有一个对象实例存在.很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线 ...
- 创建型模式(一) 单例模式(Singleton)
一.动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只 ...
- Java设计模式_创建型模式_单例模式
单例模式的实现: 定义一个类,在类中定义该类的静态变量,再定一个一个获取该类的静态变量的方法. UML图:
- Java设计模式 - 单例模式(创建型模式)
单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...
- Java 23种设计模式详尽分析与实例解析之一--创建型模式
面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...
- php设计模式(一):简介及创建型模式
我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. ...
随机推荐
- 【译】第12节---数据注解-ConcurrencyCheck
原文:http://www.entityframeworktutorial.net/code-first/concurrencycheck-dataannotations-attribute-in-c ...
- 前端面试题 | JS部分(附带答案)
目前在找工作,所以各方收集了一堆面试题.其实刷面试题的过程也能更新自己对知识的认识,所以也提醒自己多看多理解.如果对下面题目有更深理解,会实时更新.遇到新题目,也会不定时更新.希望能帮助到部分朋友- ...
- 【Django】Django-REST-Framework
[创建简单的API] 1. cmd.exe >django-admin startproject django_rest>cd django_rest\django_rest>pyt ...
- mac终端不好用?用brew神器代替
一.概念 Brew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷. 官 ...
- python 下载地址
https://www.python.org/ftp/python/
- python 删除文件夹
只能删除空文件夹,删除非空文件夹会报错 >>> import os >>> os.rmdir("/tmp/ssh-GyoPWOFZ47") Tr ...
- [转]C++中const、volatile、mutable的用法
原文:https://blog.csdn.net/imJaron/article/details/79657642 const意思是“这个函数不修改对象内部状态”. 为了保证这一点,编译器也会主动替你 ...
- 用C#二次封装虹软arcface
相信很多用C#又想用虹软的SDK的童鞋要花很多心思去研究怎么转换,所以写了一篇文章和一个demo方便用C#的童鞋方便调用虹软的接口,文章的地址是:https://blog.xgcos.com/show ...
- JAVA基础知识总结:二十二
一.反射机制 1.概念 反射机制指的是程序在运行的过程中,对于任意一个类,都能够知道这个类对应的所有的属性和方法:对于任意一个对象,都能够调用其中的任意的方法和属性,在Java中,把这种动态获取信息以 ...
- legend2---开发日志7(vue的使用场景有哪些,或者说使用的优缺点)
legend2---开发日志7(vue的使用场景有哪些,或者说使用的优缺点) 一.总结 一句话总结:任何页面都可以使用vue,尤其是有交互的或者用ajax的,但是vue插件及其它各种插件加载需要时间, ...