1.目的

控制实例的个数,类设计者应该保证只有一个实例,不能将此责任【只有一个实例】强制交给类使用者。

2.整体实现

1.单线程单例模式的实现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LearnDesignPattern
{
public class Singleton
{
private Singleton() { }//构造函数私有化,使得用户无法通过new关键字创建对象
private static Singleton instance;
public static Singleton Instance
{
get
{//懒加载模式,用户也可以每次获取的时候,都new,但是这样不推荐
//首先判断,如果为第一次使用,则进行new
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
//注意【1】,C#的单例模式一般使用属性来获取Instance
//而在Java,中一般使用public static Singleton getInstance()的方法,这点不同
//注意【2】,为什么要使用Static关键字呢,我们知道Static的关键字的作用是
//可以直接通过类名来进行调用,这样就保证了,需要先有类的实例才能获取
//非static属性的情况
}
}

2.多线程单例模式实现:

//如果两个线程同时判断instance是不是为空,当instance==null的时候
//两个线程就同时创建出来实例,这样就存在了两个实例了
public class Singleton
{
private Singleton() { }
//volatile:被volatile修饰的变量的值,将不会被本地线程换缓存
//所有对该变量的读写都是直接操作共享内存,从而确保多个线程能
//正确的处理该变量
private static volatile Singleton instance;
//添加线程锁,确保只有一个线程可以访问该范围的代码,其他线程等待
private static object objectLock = new object();
public static Singleton Instance
{
//double check双重检查机制
get
{
if (instance == null)
{
lock (objectLock)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}

3.经典的多线程单例模式写法。

 //【使用静态构造器】
//1.静态构造函数既没有访问修饰符,也没有参数
//2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类
//3.无法直接调用静态构造函数
//4.在程序中,用户无法控制何时执行静态构造函数
//【保证1】保证使用类实例或者静态成员之前初始化
//【保证2】懒加载,只有在第一次使用,才调用静态构造器
//【保证3】.net框架会自动为多线程加锁
public static readonly Singleton Instance = new Singleton();
private Singleton() { }
//【弊端】不支持参数化Singleton,因为传参必须使用方法来进行!!!GetInstance(object a,object b){}

4.参数化Singleton

//参数化Singleton
private Singleton(int a,int b)
{
this.A = a;//A、B均为静态属性
this.B = b;//A、B均为静态属性
}
public static Singleton GetInstance(int x, int y)
{
if (instance == null)
{
instance= new Singleton(x, y);
}
//可修改单例模式!就相当于修改当前单例的属性,并不会重新创建新的实例
else
{
instance.A = x;//A、B均为静态属性
instance.B = y;//A、B均为静态属性
}
return instance;
}

3.思考

1.实例的个数可以两个么?三个......多个。使用时,一次创建多个,放在池子中,使用的时候去取。

2.如何将new构造器放到其他类中,实现局部使用一个对象的实例。

3.将new进行屏蔽,然后通过其他方法来实现new的效果【不仅仅是单例】。

GoF设计模式学习-单例模式的更多相关文章

  1. (@WhiteTaken)设计模式学习——单例模式

    单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访 ...

  2. java设计模式学习 ----- 单例模式(Singleton)

    单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...

  3. 【设计模式】GoF设计模式学习总结

    什么是设计模式 为解决某一类普遍存在的问题而提供的一种解决方案: 分类及定义 创建型模式(5) 1.原型模式:通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型:详情... 2.单例模式:一 ...

  4. GOF设计模式之单例模式

    定义 单例模式(Singleton Pattern)的定义如下:Ensure a class only has one instance, and provide a global point of ...

  5. java设计模式学习-单例模式

    java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供.”单例模式可以保证一个应用中有且只有一个实例,避免了资源的浪费和多个实例多次调用导致出错. 单例模式有以下特点: 1.单 ...

  6. GOF设计模式快速学习

    这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了.为了和"学习"之间的友谊小船不翻,决定对以往学习过的GOF设计模式做一个简 ...

  7. Java设计模式学习记录-GoF设计模式概述

    前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...

  8. C#设计模式学习笔记-单例模式随笔

    最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...

  9. C#设计模式学习笔记-单例模式(转)

    C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...

随机推荐

  1. 正则表达式在JS中的使用

    <script type="text/javascript"> /** *正则表达式在js中的第一种使用方式: * RegExp 通过构造器去使用正则表达式 需要对反斜 ...

  2. 新手C#SQL Server使用记录2018.08.10

    主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...

  3. Parametric Statistics

    1.What are “Parametric Statistics”? 统计中的参数指的是总体的一个方面,而不是统计中的一个方面,后者指的是样本的一个方面.例如,总体均值是一个参数,而样本均值是一个统 ...

  4. EnumMap实现类

    从名字上看出来,EnumMap是为枚举类服务的,它的key不能为null,在创建它的时候,必须要指定一个枚举类,如: EnumMap enumMap = new EnumMap(Season.clas ...

  5. scrollLeft滚动(用animate替代)

    原: let checkedLeft1 = $('#dateBox').find('.checked').position().left let checkedLeft2 = $('#dateBox' ...

  6. C++ volatile

    volatile的位置与const相同——都是作为类型的附加修饰符 使用volatile的主要目的是提示编译器该对象的值可能在编辑器未监测的情况下被改变,因此编译器不能武断地对引用这些对象的代码作优化 ...

  7. 【英宝通Unity4.0公开课学习 】(二)场景创建

    本讲共四节,貌似讲课老师的速度变快了,2倍速听不清了...调成了1.7倍...老师果然越来越熟练了啊! 而且最开始的萌妹纸也不再出现在视频里了,我当时还想着完全可以换成老师自己提问嘛! 不过有妹纸声音 ...

  8. FileUpload控件实现单按钮图片自动上传并带预览显示

    FileUpload控件实现单按钮图片自动上传并带预览显示 1.实现原理:   FileUpload控件默认不支持服务端的ONCHANGE事件,此时用一种变通的方法借用客户端的onchange事件,调 ...

  9. [leetcode]392. Is Subsequence 验证子序列

    Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...

  10. php下的原生ajax请求

    浏览器中为我们提供了一个JS对象XMLHttpRequet,它可以帮助我们发送HTTP请求,并接受服务端的响应. 意味着我们的浏览器不提交,通过JS就可以请求服务器.   ajax(Asynchron ...