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. Java中static代码块,{}大括号代码块,构造方法代码块执行顺序!

    注:下列代码中的注释都是JUnit4单元测试运行结果. 首先,没有父类的(父类是Object)的类A package Static.of; public class A { { System.out. ...

  2. mogodb查询

    Find: {$and: [ {"MethodName":"CommLogin"} ,{"CreateTime":{$gte:"2 ...

  3. java学习笔记----@Override的作用

    初学java或多或少都会有这样的疑问,@Override有什么用,有的时候写,有的时候又不写,搞的初学者甚是郁闷. 做了一两年的开发说起这个问题不一定能够对答如流.小弟才疏学浅,花了点时间,看了一下资 ...

  4. Windows内置系统账户:Local system/Network service/Local Service 区别

    LocalSystem 账户  LocalSystem是预设的拥有本机所有权限的本地账户,这个账户跟通常的用户账户没有任何关联,也没有用户名和密码之类的凭证.这个服务账户可以打开注册表的HKEY_LO ...

  5. (动态规划)有 n 个学生站成一排,每个学生有一个能力值,从这 n 个学生中按照顺序选取kk 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 kk 个学生的能力值的乘积最大,返回最大的乘积

    第2关:最强战队 挑战任务 绿盟和各大名企合作,举办编程能力大赛,需要选拔一支参赛队伍.队伍成员全部来自“绿盟杯”中表现优秀的同学,每个同学都根据在比赛中的表现被赋予了一个能力值.现在被召集的N个同学 ...

  6. cdoj793-A Linear Algebra Problem

    http://acm.uestc.edu.cn/#/problem/show/793 A Linear Algebra Problem Time Limit: 3000/1000MS (Java/Ot ...

  7. 53. Maximum Subarray (Array; DP)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  8. Android Studio和SDK下载、安装和环境变量配置

    win10下Android Studio和SDK下载.安装和环境变量配置                                                               - ...

  9. vs2010使用中遇到的一些问题[xyytIT]

    1. 代码编辑器行号显示: 设置方法:点击菜单栏的"工具"-->"选项",弹出选项窗体-->标上选项窗体左下方的"显示所有设置" ...

  10. python的线程锁

    1.先看一个例子,一个进程可以起多个线程,多个线程都共享这个线程的内存 import threading import time num = 100 thread_lock = threading.L ...