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 最近在学设计模式,学到创建型模式的时候,碰到 ...
随机推荐
- SQL获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)
获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...
- WebDriverException:Element is not clickable at point - selenium执行过程中遇到的相关报错
Element is not clickable at point (x, y) 这段可以忽略:本文来自 https://www.cnblogs.com/lozz/p/9947430.html 引起这 ...
- HTML的实际演练1
1.HTML介绍 一个网站的建立都是HTML的,例如大家可以打开F12就可以看到浏览器的一个开发者模式,就可以看到网页的源代码了: 当然这网页他有很多的标签编写组成的,有的显示文字,段落,有的是个超链 ...
- [leetcode]295. Find Median from Data Stream数据流的中位数
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
- discuz回贴通知插件实现-用户状态设置
1.获取用户提交数据 discuz通过$_GET来获取全部数据,包括($_GET,$_POST). else if($_GET['pluginop'] == 'set') { //获取用户提交数据 $ ...
- linux安装php 按 apache方式
1.下载php源码包 在 http://php.net/downloads.php 下载 php-5.6.11.tar.gz 2.进入到php源码包中,configure > ./configu ...
- Halcon的一维条码解码步骤和解码技巧
一.图像预处理和条码增强 对比度太低:scale_image(或使用外部程序scale_image_range),增强图像的对比度. 图像模糊:emphasize锐化图像,使条码看起来更清晰. 深色背 ...
- ubuntu 开机自动挂载nfs服务器上的home分区
通过‘fstab’也可以配置 NFS 和 SMB 的共享目录.由于涉及到的可选项很重要,并且需要了解一些协议的工作情况,您得先阅读 Samba 和 NFS . 基本语法和本地介质相差不是很多.条目中的 ...
- windows驱动
DriveEntry() 启动 停止 接口函数 驱动程序名 驱动程序版本号 异常处理 是否运行 声明LPOReceive类型的函数 声明函数指针(外部传进来的回调函数) 存放配置字符串 本机IP 串口 ...
- 深入浅出 JMS(四) - ActiveMQ 消息存储
深入浅出 JMS(四) - ActiveMQ 消息存储 一.消息的存储方式 ActiveMQ 支持 JMS 规范中的持久化消息与非持久化消息 持久化消息通常用于不管是否消费者在线,它们都会保证消息会被 ...