考的好不好?-单例模式来解答
来源:互联网 发布:什么借钱软件最靠谱 编辑:程序博客网 时间:2024/04/28 21:16
前言:
从小就很反感考试,因为每次考试完不管是谁,碰见你的第一句问候语就是:考试考得怎么样啊?期末成绩出来了吗?……所以从小就很害怕成绩单的出现,因为成绩单只要不出现,自己就可以随意编篡,问自己考得怎么样?当然往好里说吧!还行吧!挺好的……
因为考试考得好不好,是由自己内心来判断的,考得好,我当然希望告诉他人;但是考得不好,我也不想让他人知道,所以只要蒙混过关就可!这样就谈到了今天的主题-单例模式,某件事情我只想让他出现一次,而非每次点击都出现,这就是所谓的实例化,实例化与否的过程其实就是和考试考得好不好的过程一样,应该由自己来判断,要勇于承担责任,这才是当今一代的学习楷模。
定义:
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
方法:
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
结构图:
好处:
1)保证唯一的实例
2)单例模式因为Singleton类封装它的唯一实例,这样它可以严格地控制客户怎样访问它以及何时访问它,简单点就是对唯一实例的受控访问。
多线程单例:
多线程的程序中,多个线程同时访问Singleton类,调用GetInstance()方法,会有可能造成创建多个实例的。
解决办法:给进程加一把锁来处理。
Lock:是确保一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程视图进入锁定的代码,则它将一直等待(即被组织)直到该对象被释放。
class Singleton { private static Singleton instance; //程序运行时创建一个静态只读的进程辅助对象 private static readonly object syncRoot = new object(); private Singleton () { } public static Singleton GetInstance() { lock (syncRoot ) //在同一个时刻加了锁的那部分程序只有一个线程可以进入 { if (instance ==null ) { instance = new Singleton(); } } return instance; }这段代码使得对象实例由最先进入的那个线程创建,以后的线程在进入时不会再去创建对象实例了。但是instance有没有被创建过实例根本不知道,所以优化之后:
public static Singleton GetInstance() { if (instance == null) //先判断实例是否存在,不存在再加锁处理 { lock (syncRoot) //在同一个时刻加了锁的那部分程序只有一个线程可以进入 { if (instance == null) { instance = new Singleton(); } } } return instance; }
构建方式:
饿汉式单例类
懒汉式单例类
懒汉式单例类在单例类被加载的时候,就实例化一个对象交给自己的应用;而懒汉式在调用取得实例方法的时候才会实例化对象。代码如下:
懒汉式:
public sealed class Singleton //阻止发生派生,而派生可能会增加实例 { private static class Singleton { //在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化 private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton GetInstance() { return instance; } }饿汉式:
public class Singleton //阻止发生派生,而派生可能会增加实例 { private static class Singleton=null ; { private Singleton() { } public static synchronized synchronized GetInstance() { if (Singleton ==null ) { Singleton = new Singleton(); } return instance; } }对于懒汉和饿汉的使用,由于饿汉式,即静态初始化的方式,它是类一加载就实例化的对象,所以要提前占用系统资源。然而懒汉式又要面临着多线程访问的安全性问题,需要做双重锁定这样的处理才可以保证安全。所以至于使用哪种方式,应该取决于实际的需求。但是从c#的角度来看,饿汉式单例类应能够满足我们的需求。
单例模式与静态类
总觉得单例模式有点像一个实用类的静态方法,那么有些什么区别呢?来仔细分析一下:
1)单例模式相比静态类的优势:单例可以继承类,实现接口,而静态类不能;单例可以被延迟初始化,静态类一般在第一次加载是初始化;单例类可以被集成,他的方法可以被覆写。
2)静态方法中产生的对象,会随着静态方法执行完毕而而释放掉,而且执行类中的静态方法时,不会实例化静态方法所在的类
3)在不存在比较复杂的事务管理,用Singleton比较好。
7 0
- 考的好不好?-单例模式来解答
- 考的好不好?-单例模式来解答
- 面试官最喜欢考的设计模式---单例设计模式
- 单例模式来咯!
- 【Dongle】【软考】【设计模式】单例模式
- 【软考学习】设计模式——单例模式
- 经典的单例模式c3p0来控制数据库连接池
- 来点积分好不好
- 【CSDN常见问题解答】Java单例模式分析
- 让我们来破坏单例模式
- 用户枚举来实现单例模式
- 使用枚举来实现单例模式
- 使用宏来实现单例模式
- 利用C++对象确定性析构的原则来解析单例模式
- C++常考笔试题:用C++实现单例模式
- 黑马程序员:java基础——单例设计模式,synchronized及面试常考内容
- 过的好不好
- 设计模式 单例模式 优雅的单例模式
- java反射机制详解 及 Method.invoke解释
- android 开启闪关灯手电筒的实现
- cocos2d-x 3.0正式版 环境搭建 (解决加载失败,未能加载XXX包)
- 【小白笔记】PHP学习之路 (33) --正则表达式
- 动态顺序栈的C语言实现!
- 考的好不好?-单例模式来解答
- ZooKeeper安装过程 .
- spring-1.0.jar下载
- 安装第三方库的神器CocoaPods
- SCI收录中国期刊一览表
- javaEE jdbc获取数据2(存储过程调用和结果集获取)
- hdu 1811 拓扑排序和并查集
- MySql 获取所有的表信息、字段信息
- 自定义组件实现可滑动的ToggleButton的功能..