GoF设计模式学习-单例模式
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设计模式学习-单例模式的更多相关文章
- (@WhiteTaken)设计模式学习——单例模式
单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访 ...
- java设计模式学习 ----- 单例模式(Singleton)
单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...
- 【设计模式】GoF设计模式学习总结
什么是设计模式 为解决某一类普遍存在的问题而提供的一种解决方案: 分类及定义 创建型模式(5) 1.原型模式:通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型:详情... 2.单例模式:一 ...
- GOF设计模式之单例模式
定义 单例模式(Singleton Pattern)的定义如下:Ensure a class only has one instance, and provide a global point of ...
- java设计模式学习-单例模式
java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供.”单例模式可以保证一个应用中有且只有一个实例,避免了资源的浪费和多个实例多次调用导致出错. 单例模式有以下特点: 1.单 ...
- GOF设计模式快速学习
这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了.为了和"学习"之间的友谊小船不翻,决定对以往学习过的GOF设计模式做一个简 ...
- Java设计模式学习记录-GoF设计模式概述
前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...
- C#设计模式学习笔记-单例模式随笔
最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...
- C#设计模式学习笔记-单例模式(转)
C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...
随机推荐
- 吴裕雄 数据挖掘与分析案例实战(3)——python数值计算工具:Numpy
# 导入模块,并重命名为npimport numpy as np# 单个列表创建一维数组arr1 = np.array([3,10,8,7,34,11,28,72])print('一维数组:\n',a ...
- git hg提交拉取
工作总结web_acl 535 git clone “ssh://git@outergit.yonyou.com:49622/esn_web/web_acl.git" 600 git bra ...
- 这两天的刷机+Root
最近为了研究Xposed框架的搭建使用,将自己红米Note2尝试root后,开不了机了.后使用(网上下载的线刷宝,刷的官网线刷宝成功开机了,然后里面会自带很多软件,然后通过下载KingRoot将手机自 ...
- 自对齐(self-aligned)
C语言是自对齐的,32位以4字节对齐,64位以8字节对齐(1字节=8 bits) 自对齐的好处:在一条指令内完成数据的取或者存的操作,使得内存访问更快:否则,如果一个变量跨机器字存储,那么要做两次或更 ...
- [leetcode]277. Find the Celebrity谁是名人
Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...
- php使用数组语法访问对象
有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现SPL的ArrayAccess接口来解决. 使用场景:加载配置文件类.larvel框架加载配置文件就这利用数组来操作对象. 数组式访问Obj ...
- fragment Activity之间传值的方法 之------------接口回调
首先 定义一个 回调接口 public interface FragmentCallBack { public void callbackFun1(Bundle arg); public void ...
- Javascript中escape()、encodeURI()、encodeURIComponent()的区别
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- JDK和Eclipse的下载路径
JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse http://www.eclipse.or ...
- Mina 系列(四)之KeepAliveFilter -- 心跳检测
Mina 系列(四)之KeepAliveFilter -- 心跳检测 摘要: 心跳协议,对基于CS模式的系统开发来说是一种比较常见与有效的连接检测方式,最近在用MINA框架,原本自己写了一个心跳协议实 ...