[Head First设计模式]一个人的平安夜——单例模式
系列文章
[Head First设计模式]山西面馆中的设计模式——装饰者模式
[Head First设计模式]山西面馆中的设计模式——观察者模式
[Head First设计模式]山西面馆中的设计模式——建造者模式
[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
引言
已经不想再数这是第多少个一个人的平安夜了,一个人走在路上,发现满脑子的技术问题,也许,在技术中才能找到一点安慰吧。很多朋友一直问我,为什么那么拼,lz只是觉得“如果连自己喜欢的工作,都做不好,那么活着就太空虚了,男人么就应该对自己恨一点。如果你现在没有得到你想要的生活,只能说明你对自己还不够狠”。言归正传,说说今天的单例模式。
单例模式定义
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
大家都知道“一夫一妻制”,在中国,一个男人,有且只能有一个媳妇,如果你非要找个小三,势必会增加开销,占用更多资源。所以没资本的屌丝们,劝你们,媳妇这个对象有且只能创建一个,如果你不自量力,非要整个小三出来,像某某官员,一般不会出问题,但当小三和你媳妇争夺资源的时,势必会出现致命性的bug,信不信由你?
单例模式类图

(类图来自:http://www.cnblogs.com/zhili/p/SingletonPatterm.html,这里借用一下)
实现单例模式条件
通过观察上面类图可知:
1.静态的私有化字段;
private static readonly Singleton uniqueInstance = new Singleton();
2.私有构造器
private Singleton(){ }
3.提供公共的访问该类实例的方法.
public static Singleton GetInstance()
{
return uniqueInstance;
}
常见的单例模式
一,饿汉式
public sealed class Singleton
{
#region 饿汉式
private static readonly Singleton uniqueInstance = new Singleton();
private Singleton() { }
public static Singleton GetInstance()
{
return uniqueInstance;
}
#endregion
}
优点:
1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
3.通过sealed修饰类,阻止派生类的出现,因为派生可能会增加实例。
缺点:
资源效率不高,可能GetInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化。
二,懒汉式
public sealed class Singleton
{
private static Singleton instance;
//程序运行时创建一个静态的只读对象
private static readonly object o = new object();
private Singleton() { }
public static Singleton GetInstance()
{
//双重锁
//先判断实例是否存在,不存在再加锁处理
//这样不用让线程每次都加锁,保证了线程安全,也提高了性能
if (instance == null)
{
//保证只有一个线程
lock (o)
{
///若实例不存在,则new一个新实例,否则返回已有的实例
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
懒汉式面临线程安全的问题,通过双重锁定这样的处理才可以保证安全。
测试
class Program
{
static void Main(string[] args)
{
Singleton singleton1 = Singleton.GetInstance();
Singleton singleton2 = Singleton.GetInstance();
if (singleton1==singleton2)
{
Console.WriteLine("两个对象一样");
}
Console.Read();
}
}
结果
本打算创建个对象,给我买个苹果的,看来两个对象一样,也只能自己给自己买了。
总结
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
[Head First设计模式]一个人的平安夜——单例模式的更多相关文章
- 我的平安夜-Merry Christmas
我的平安夜-Merry Christmas 平安夜给自己买的第一个"苹果",嘻嘻. 今夜,不想去学习技术知识点什么的, 我们就想到哪里写哪里,就简单聊聊思维方式吧. 其实我不想做今 ...
- TEST ON 平安夜
1.前言 = = 感觉自己其实没发过关于考试的博客过... 今天是一个平安的夜晚,漆黑的夜被霓虹划分成网络,很适合发题. 2.num9九数码问题 传统8数码改一下...只询问一个状态,所以很容易搞,正 ...
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- IOS设计模式之一(MVC模式,单例模式)
iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...
- 《javascript设计模式》读书笔记四(单例模式)
1.单利模式简单介绍 在<设计模式>中单利模式是一种比較简单的模式,定义例如以下: 确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 在javascript中则将代码组 ...
- Java设计模式学习笔记,一:单例模式
开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的 ...
- JAVA设计模式详解(四)----------单例模式
上一章我们学习了装饰者模式,这章LZ带给大家的是单例模式. 首先单例模式是用来干嘛的?它是用来实例化一个独一无二的对象!那这有什么用处?有一些对象我们只需要一个,比如缓存,线程池等.而事实上,这类对象 ...
- 设计模式php篇(一)————单例模式
话不多说,直接上代码: <?php namespace DesignPattern; /** * php设计模式之单例模式 */ class SingleInstance { private s ...
- Python版设计模式: 创建型模式:单例模式和工厂模式家族
一. 单例模式(Singleton) 所谓单例模式,也就是说不管什么时候都要确保只有一个对象实例存在.很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线 ...
随机推荐
- 3-2 bash 特性详解
根据马哥Linux初级 3-2,3-3,编写 1. 文字排序 不影响源文件,只是显示根据ASCII码字符升序 nano的用法, 其实这个是生成一个文本,然后就可以在里面编辑. Ctrl + o, 后回 ...
- Entity Framework 中使用SQL Server全文索引(Full Text Search)
GitHub:https://github.com/fissoft/Fissoft.EntityFramework.Fts EntityFramework中原来使用全文索引有些麻烦,需要使用DbCon ...
- 1、策略模式(Strategy)
//抽象接口 class ReplaceAlgorithm { public: ; }; //三种具体的替换算法 class LRU_ReplaceAlgorithm : public Replace ...
- 关于linux中的时间 时区问题
本文部分来源于: http://hi.baidu.com/peruke/blog/item/b8de06ec6a04583b27979132.html 系统是fedora: glibc实现了从RTC ...
- Azure机器学习入门(一)
我们开始深入学习Azure机器学习的基本原理并为您开启伟大的数据科学之门.Azure 机器学习的一个重要特征就是在构建预测分析方案时,它能够方便地将开发模式集成为可重复的工作流模式.这就使得Azure ...
- 配置jpa
persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence ver ...
- 第6章 Java类中的方法
1.如何定义java的方法 什么是方法:方法使用来解决一类问题的代码集合,是一个功能模块在类中定义个方法的方法是: 访问修饰符 返回值类型 方法名(参数列表){ 方法体 } 1.访问修饰符,是限制该方 ...
- 利用DotSpatial发布WMS, WFS服务
我们遇到的几个给政府部门做的GIS系统,一般都只要面子,只要好看,领导高兴得不得了,点点这里点点那里,哟,这按钮一点还会转,领导开心得跟朵花似的...要是搞个各种分析什么的全堆上来,他就嫌烦了...这 ...
- [LeetCode] The Skyline Problem
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- LeetCode-66-Plus One
Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...