C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)
一:模式分类
从目的来看:
创建型(Creational)模式:负责对象创建。
结构型(Structural)模式:处理类与对象间的组合。
行为型(Behavioral)模式:类与对象交互中的职责分配。
从范围来看:
类模式处理类与子类的静态关系。
对象模式处理对象间的动态关系。
二:Singleton (创建型模式) 单件
1.动机(Motivation)
软件系统中,经常有这样一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例 ?
这应该是类设计者的责任,而不是使用者的责任。
2.意图(Intent)
保证一个类仅有一个实例,并提供一个该实例的全局访问点。 ——《设计模式》 GOF
3.结构(Structure)
三:实现
1.单线程Singleton模式实现
1.2单线程Singleton几个要点:
Singleton模式中的实例构造器可以设置为protected以允许子类派生。
Singleton模式一般不要支持Icloneable接口,因为这可能导致多个实例对象,与Singleton模式初衷违背。
Singleton模式一般不要支持序列化,因为这可能导致多个实例对象,与Singleton模式初衷违背。
Singleton模式只考虑对象创建的管理,没有考虑对象销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行管理特殊管理。
不能应对多线程情况,在多线程环境下仍有可能出现多个对象实例。
public class MySigleton_SingleProcess
{
private static MySigleton_SingleProcess instance; private MySigleton_SingleProcess() { } public static MySigleton_SingleProcess GetMySingletonInstance()
{
if(instance==null){
instance = new MySigleton_SingleProcess();
}
return instance;
}
}
2.多线程Singleton模式实现
public class MySigleton_MultiProcess
{
private static MySigleton_MultiProcess instance; private static readonly object lockHelper=new object(); private MySigleton_MultiProcess() { } public static MySigleton_MultiProcess GetMySingletonInstance()
{
if (instance == null)
{
lock (lockHelper)
{
//double check 预防代码编译的时候作出优化调整了代码执行顺序
if (instance == null)
{
instance = new MySigleton_MultiProcess();
}
} }
return instance;
}
}
3.使用.NET初始化机制实现多线程Singleton模式
public class Singleton
{
private static readonly Singleton _instance = new Singleton(); // Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
} /// <summary>
/// Prevents a default instance of the
/// <see cref="Singleton"/> class from being created.
/// </summary>
private Singleton()
{
} /// <summary>
/// Gets the instance.
/// </summary>
public static Singleton Instance
{
get
{
return _instance;
}
}
}
4.Singleton 模式扩展
将一个实例扩展到多个实例,比如对象池的实现。
将New构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
Singleton 模式核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。
5. .NET框架中Singleton模式的应用
Object 基类中的 GetType() 。
C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)的更多相关文章
- php设计模式(一):简介及创建型模式
我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. ...
- 面向对象设计模式纵横谈:Singelton单件模式(笔记记录)
李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得 ...
- Singleton patterns 单件(创建型模式)
1.模式分类 1.1 从目的来看: • – 创建型(Creational)模式:负责对象创建. • – 结构型(Structural)模式:处理类与对象间的组合. • ...
- .NET设计模式(7):创建型模式专题总结(Creational Pattern)(转)
概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...
- .NET设计模式(7):创建型模式专题总结(Creational Pattern)
):创建型模式专题总结(Creational Pattern) 创建型模式专题总结(Creational Pattern) --.NET设计模式系列之七 Terrylee,2006年1月 转载: ...
- 设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...
- C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)
动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- 面向对象设计模式纵横谈:Factory Method 工厂方法模式(笔记记录)
从耦合关系谈起 耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关模块都要随之更改 -模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 ...
随机推荐
- ButterKnife Zelezny从配置到使用
插件介绍:ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成.又一神器,完美告别 ...
- iOS 自定义方法 - 播放GIF
示例代码 ///////////////////////第一种/////////////////////// //// GifView.h// GIFViewer//// Created by ...
- 关于case语句中声明变量并初始化的注意事项
今天看到一句对这个问题特别精辟的总结,记录如下: It is possible to transfer into a block, but not in a way that bypasses dec ...
- PHPmailer关于Extension missing: openssl报错的解决
最近在写一个网页的时候,需要用到PHPmailer来发送邮件,按照官网上给出的demo写出一个例子,却报错Extension missing: openssl 最后发现需要修改php.ini中的配置: ...
- mdadm设定RAID磁盘阵列,且当分区故障后如何重建
首先,fdisk建立不同分区,且设为fd格式 其次, mdadm -C md0 -a yes -l -n /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sd ...
- Torch7在Ubuntu下的安装与配置
Torch7的本系列教程的主要目的是介绍Torch的入门使用.今天首先分享一下Torch7的安装.(在Ubuntu14.04安装torch7) 为什么选择Torch Torch的目标是在建立科学算法的 ...
- pitch yaw roll是什么
虚拟现实 三维空间的右手笛卡尔坐标如图1所示. 图1 在航空中,pitch, yaw, roll如图2所示. pitch是围绕X轴旋转,也叫做俯仰角,如图3所示. yaw是围绕Y轴旋转,也叫偏航角,如 ...
- 项目游戏开发日记 No.0x000002
14软二杨近星(2014551622) 项目开发的开始, 到现在已经很久了, 软件工程的课也上了很久了, 不过, 我们的游戏现在依然还没有影子, 只能说...还是啥也不会... 从一开始, 兴致勃勃地 ...
- iOS 解决LaunchScreen中图片加载黑屏问题
iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...
- 使用FastReport打印二维码
简单介绍一下该功能所在的项目背景:C#语言编写的WPF客户端应用程序,在“结账”模块中,打印出的收款小票上需要显示一个二维码,服务生拿着小票去找顾客,顾客可以选择现金.银行卡等普通支付方式,也可以直接 ...