创建型模式篇(单例模式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中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. ...
随机推荐
- transient关键字详解
作用 1,一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. 2,transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被tr ...
- 使用v-for循环写入html内容,每一项的数据的写入
项目使用vue.js,在写某个dialog页面时,需要循环后台的数据(班级,班级学生名单,已选学生名单,发布时间,截止时间,答案显示等). 遇到的问题:循环绑定的值是相同的,而且改动一个值,其他ite ...
- 深究CSS中Position的属性和特性
一.position的概念 作为布局必不可缺少的元素之一,深究其属性以及一些注意点是非常必要的. 定义:规定元素的定位类型. position属性: 属性 描述 常用性 absolute 生成绝对定位 ...
- [原][osg][osgearth]倾斜摄影2.文件格式分析:OSGB
倾斜摄影三维模型格式包含:*.osgb,*.dae等 文件格式包含:*.xml, *.desc, *.lfp等 例如:LocaSpace Viewer软件把osgb分块模型文件建立索引生成一个lfp文 ...
- Android AndFix修复方式的限制
这里阅览了很多网上关于修复的资料,一一贴在这里便于查看: https://github.com/alibaba/AndFix 这是官方处 要了解使用,一定得看看这里. http://www.jia ...
- 力扣(LeetCode)7.整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...
- leecode第五十九题(螺旋矩阵 II)
class Solution { public: vector<vector<int>> generateMatrix(int n) { )//特殊情况 { vector< ...
- 第 7 章 多主机管理 - 046 - 创建 Machine
创建 Machine Machine 就是运行 docker daemon 的主机. “创建 Machine” 指的就是在 host 上安装和部署 docker. 创建第一个 machine: hos ...
- 环境变量LD_LIBRARY_PATH的传递
http://bbs.chinaunix.net/thread-3680861-1-1.html execv明显没有传环境变量,execle或execve才会带在启动shell设置的LD_LIBRAR ...
- idea ----> 使用idea工具整合mybaiti时出现的问题总结
使用idea测试mabtis实例时出现 java.lang.IllegalArgumentException: Mapped Statements collection does not conta ...