系列文章

[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设计模式]一个人的平安夜——单例模式的更多相关文章

  1. 我的平安夜-Merry Christmas

    我的平安夜-Merry Christmas 平安夜给自己买的第一个"苹果",嘻嘻. 今夜,不想去学习技术知识点什么的, 我们就想到哪里写哪里,就简单聊聊思维方式吧. 其实我不想做今 ...

  2. TEST ON 平安夜

    1.前言 = = 感觉自己其实没发过关于考试的博客过... 今天是一个平安的夜晚,漆黑的夜被霓虹划分成网络,很适合发题. 2.num9九数码问题 传统8数码改一下...只询问一个状态,所以很容易搞,正 ...

  3. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  4. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  5. 《javascript设计模式》读书笔记四(单例模式)

    1.单利模式简单介绍 在<设计模式>中单利模式是一种比較简单的模式,定义例如以下: 确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 在javascript中则将代码组 ...

  6. Java设计模式学习笔记,一:单例模式

    开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的 ...

  7. JAVA设计模式详解(四)----------单例模式

    上一章我们学习了装饰者模式,这章LZ带给大家的是单例模式. 首先单例模式是用来干嘛的?它是用来实例化一个独一无二的对象!那这有什么用处?有一些对象我们只需要一个,比如缓存,线程池等.而事实上,这类对象 ...

  8. 设计模式php篇(一)————单例模式

    话不多说,直接上代码: <?php namespace DesignPattern; /** * php设计模式之单例模式 */ class SingleInstance { private s ...

  9. Python版设计模式: 创建型模式:单例模式和工厂模式家族

    一. 单例模式(Singleton) 所谓单例模式,也就是说不管什么时候都要确保只有一个对象实例存在.很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线 ...

随机推荐

  1. android 解决ListView点击与滑动事件冲突

    如果你的ListView的Item有滑动功能,但又点击Item跳转到其它activity,这样若是在Adapter里面写点击事件是会导致滑动事件获取不到焦点而失效: 解决方法:不要在adapter里面 ...

  2. HttpUrlConnection 的 setDoOutput 与 setDoInput

    1 前言 在使用java中的HttpUrlConnection请求一个http网络地址时,我们有时候需要用到此类中的setDoOutput和setDoInput这两个方法,以前学习java的时候,根本 ...

  3. Csharp--Read Csv file to DataTable

    在网上找的资料都不怎么好使,许多代码一看就知道根本没有考虑全面. 最后找到一个好用的,在codeproject上,这位老兄写成了一个framework,太重了. http://www.codeproj ...

  4. [django]用户认证中只允许登陆用户访问(网页安全问题)

    当设计一个重要网页时,一般要求未从登陆界面访问的用户不能进入其他页面,那么需要如何设置呢? 如下 django中的url.py urlpatterns = [    url(r'^$', 'login ...

  5. Struts2 internationalization(国际化)

    1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素.换言之,应用程序的功 ...

  6. thinkphp发送邮件

    看thinkPHP手册发送邮件 Thinkphp3.2 PHPMailer 发送邮件结合QQ企业邮箱发送邮件下载附件PHPMailer解压到ThinkPHP\Library\VendorPHPMail ...

  7. simpleCart的简单使用及配置

    simpleCart的功能就不用解释,购物车,很6.官网上的说明太模糊了,还是GIHUb上的好一点:https://github.com/wojodesign/simplecart-js/ 文章解决问 ...

  8. BZOJ1856[SCOI2010]字符串

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...

  9. git教程链接

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  10. jenkins 入门教程(上)

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...