C#面向对象设计模式纵横谈2 Singleton单件创建型模式

C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式) C#面向对象设计模式纵横谈 第二课 Singleton 单件(创建型模式) 立即下载

Singleton单件(创建型模式)

模式分类:
从目的来看:
创建型(Creational)模式:负责对象创建
常规的对象创建方式:new对象
结构型(Structural)模式:处理类与对象间的组合
这个类是组合的关系更好,继承的依赖性太强。
行为型(Behavioral)模式:类与对象交互中的职责分配。

从范围来看:
类模式处理类与子类的静态关系;
对象模型处理对象间的动态关系。

动机(Motivation)
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统
中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

这应该是类设计者的责任,而不是使用者(客户程序)的责任。

意图(Intent):满足动机,保证类只有一个实例,并提供一个
该实例的全局访问点。

Singleton单件最基本的实现代码举例

public class Singleton
{
    //静态私有字段,不希望外界直接去访问它
    private static Singleton instance;
    //私有实例构造器,空的实现。意义:让这个类的使用
    者调不到这个构造器,防止外界使用new来创建它,
    如果把这个代码注释掉,则可以调用
    private Singleton(){}

    //静态只读属性
    pubuli static Singleton Instance
    {
        get
        {
            //提倡使用这种,晚加载,如果客户不需要这个实例
            就不要去new它
            if(instance==null)
            {
                //在类型里边可以调用new
                instance=new Singleton();
            }
            return instance;
        }
    }
}

class Test
{
    public Static void Main()
    {
        //如果把上面这句代码private Singleton(){}
        注释掉,则调用者可以new实例,这不是我们想要的
        //Singleton t=new Singleton();

        singleton t1=Singleton.Instance;
        singleton t2=Singleton.Instance;
        //t1和t2是相等的,可以测试一下
        Console.WriteLine(Object.ReferenceEquals(t1,t2)==true);
    }
}

Singleton单件最基本的实现代码举例2(这么写也行)

public class Singleton
{
    //静态私有字段,不希望外界直接去访问它
    private static Singleton instance=new Singleton();

    private Singleton(){}

    //静态只读属性
    pubuli static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

Singleton模式一般不要去序列化。创建对象最初始的可以通过
构造器创建,但如果你已经有了一个对象,可以把这个对象序列化
到一个内存流中或到一个硬盘文件中,然后在做一个反序列化,
它就会出来一个新的实例。这个实例的引用和原来的地址是不一样
的。

Singleton模式只考虑了对象创建的管理,没有考虑对象销毁的管理
并不是我们不愿意去考虑,而是考虑它的收获不大。1、对于支持垃圾
回收的平台,垃圾回收会自己回收(在类型卸载的时候被回收),
不会导致内存泄露。2、往往是因为我们引用了一个静态字段,而
且只能读不能写,一旦初始化之后,它就是一个全局的根对象。
就不能被回收。而且这个对象的开销不到,仅仅只有一个

Singleton模式不能应对多线程模式:使用多线程仍有可能得到
类的多个实例。一个线程到了if处,判断为空,往下走但没有创建
实例,另一个线程也到了if处,这样就有可能new多个实例。
多线程的单一实例不能保证

多线程Singleton模式设计:
public class Singleton
{
//加了一个volatile修饰,可以保证特定平台的实现必须
不要去重新调整指令,以保证对象构造非常严格的顺序,
如果把这个关键字去掉,还是有可能出现多个实例
private static volatile Singleton instance=null;

//一个辅助器,本身不参与真正意义上的构建
private static object lockHelper=new Object();

//私有构造器
private Singleton() { }

//静态属性,这里也可是方法,如果是方法,把get去掉即可
pubuli static Singleton Instance
{
    get
    {
        if(instance==null)
        {
            //加锁
            lock(lockHelper)
            {
                //双检查DoubleCheck目的:使用lock语句来避免多线程的访问
                if(instance==null)
                {   
                    instance=new Singleton();
                }
            }
        }
    }
}

}

多线程Singleton模式设计2:(别看代码简单,也全部实现了singletonmos的
要求,有一点点弊端:不支持参数化的Singleton,不支持构造器接收参数)
class Singleton
{
//内敛初始化:在声明的同时进行了初始化,内敛初始化
会把初始化拉到真正的构造器中进行初始化
public static readonly Singleton Instance=new Singleton();

private Singleton(){};

}

上面两句代码等同于以下代码:
class Singleton
{
//静态字段
public static readonly Singleton Instance;

//放在静态构造器进行初始化,静态构造器充当的角色:
1、静态构造器的执行时间只在静态字段初始化之前执行
static Singleton()
{
    //初始化
    Instance=new Singleton();
}

private Singleton(){ }

}

class Test
{
public static void Main()
{
//.net类型初始化机制保证这个字段被访问之前,
肯定要先先走静态构造器,可以精确的保证。
这是第一点,我们保证了只要你访问这个Instance,
就能够达到字段被实例化这么一个目的。第二点,这个
实例还要保证能够进行一个环视评估,如果我们不用就
不会对其进行实例化。第三点是为什么能够支持多线程
环境下的singleton模式呢?是因为静态构造器可以保证
多线程环境下只有一个线程执行了这个构造器,不可能有
多个线程去执行构造器。.net机制会免费给
—-static Singleton()
—-{
—-//初始化
—-Instance=new Singleton();
—-}这个代码加锁。
Console.WriteLine(Singleton.Instance);
}
}

静态构造器不支持参数,所有不能传参,使用构造属性的方式实现

class Singleton
{
    public static readonly Singleton Instance=new Singleton();

    private Singleton(){};

    //辅助函数,专门做一些初始化的工作
    public void Init(FileStream fs)
    {
        //可以在这里做一些资源的处理初始化工作
    }   

    //属性
    public int X
    {
        get{return this.x;}
        set{this.x=x}
    }
    public int Y
    {
        get{return this.y;}
        set{this.y=y;}
    }
    int x;
    int y;
}

class Test
{
    public static void Main()
    {
        Singleton instance=Singteton.Instance();
        //先做一个资源初始化的调用
        instance.Init=(new FileStream("...."));
        instance.X=100;
        instance.Y=200;
        Console.WriteLine(instance);
    }
}

高手写的代码不是让人觉得这个东西好复杂,真正令人惊颤的代码
是看到你的代码哦好简单啊,我怎么没想到。能够用简单的东西
来实现复杂的东西。其实是大家追求的一个境界

面向对象设计案头必备:
《设计模式:可复用面向对象软件的基础》
《设计模式:可复用面向对象软件的基础》GoF
《敏捷软件开发:原则、模式与实践》Robert C.Marhin
《重构:改善既有代码的设计》 Martin Fowler

【蓝牙专题】HCI协议解析 一、概念: 很多人接触蓝牙,是从HCI开始,因为HCI是主机控制接口协议(Host Controller Interface),蓝牙命令通过HCI来发送到Controller; 1、架构 如下图,HCI通过物理接口(USB、UART等)或虚拟接口,传递数据到Controller,Controller也通过同样的接口发送接收数据,这里注意到HCI层是在L2CAP层之下,LMP层之上; HCI 阅读详情

相关推荐

免Root抓包神器Packet Capture:安卓App数据捕获全攻略

本文详细介绍了免Root安卓抓包神器Packet Capture的安装与使用全攻略。通过利用安卓系统的VPN Service API,该工具无需Root权限即可捕获并解密App的HTTP/HTTPS网络流量。文章从核心原理、证书安装、实战抓包步骤到结果分析与常见问题排查,提供了完整指南,是移动端开发、安全测试和数据分析的实用利器。

weixin_29232507的博客 1077

[整理]C#面向对象设计模式纵横谈(2):Singleton单件(创建型模式)

 2.1模式分类从目的来看:– 创建型(Creational)模式:负责对象创建。– 结构型(Structural)模式:处理类与对象间的组合。– 行为型(Behavioral)模式:类与对象交互中的职责分配。从范围来看:– 类模式处理类与子类的静态关系。–     对象模式处理对象间的动态关系。2.2动机(Motivation)在软件系统中,经常有这样一些

saintqiqi的专栏 685

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 本培训课程探讨GoF23之Singleton 单件模式的意图、动因、原理、应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用。 开始时间: 2005/10/25 14:30:00 技术等级: Level 300 产品: Visual Studio 2005 系列: C#面向对...

weixin_30480075的博客 91

Windows/Linux双平台指南:3种方法快速释放被占用的GPU内存(含任务管理器替代方案)

本文详细介绍了在Windows和Linux双平台下快速释放被占用GPU内存的3种方法,包括任务管理器替代方案。从基础操作到高阶技巧,帮助用户彻底解决GPU内存驻留问题,提升计算资源利用率。特别适用于深度学习开发者和服务器管理员处理显存泄漏等常见问题。

j0k1l2m3n的博客 262

【LDLTS解析】从重叠峰到精准参数:拉普拉斯深能级瞬态光谱如何重塑半导体缺陷分析

本文深入解析了拉普拉斯深能级瞬态光谱(LDLTS)技术如何革新半导体缺陷分析。针对传统DLTS难以分辨重叠峰的痛点,LDLTS通过拉普拉斯逆变换对高精度电容瞬态曲线进行数学解卷积,成功分离发射率相近的缺陷信号,实现从模糊宽峰到精准独立峰的转变。该技术不仅大幅提升了缺陷激活能和捕获截面等关键参数的提取精度,更推动分析范式从经验拟合转向第一性原理,为先进半导体工艺开发与良率提升提供了强大的精准诊断工具。

weixin_29224309的博客 274

C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记

(很喜欢李建忠老师的这个讲座,可惜暂时没更多的了,继续关注 MSDN WebCast 网络广播)C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)模式分类    目的 创建型 结构型 行为型       范       围   类 工厂方法(Factory Method) 适配器(类,Adapter) 解释器(Interpreter) 模板方法...

yyw84 172

TC3XX - MCAL知识点(十三):IOM EB-tresos配置说明及代码浅析

输入输出监视器(IOM)驱动程序作为比较单元,检查系统外设输出的正确操作,这些输出可以作为监视功能的输入。监控功能需要通过配置IOM硬件来实现。它向SMU生成全局系统事件。IOM驱动程序初始化并控制微控制器的IOM单元。驱动程序还为用户提供初始化和设置IOM内部单元的阈值的服务。它还应该提供重置IOM内核的服务。应该提供该服务来组合单个或多个本地事件,以生成单个全局系统事件。IOM驱动程序严重依赖于初始化和配置。软硬件关系如下图缩写解释LAM逻辑分析模块ECM事件组合模块FPC。

梦想技术家 1802

C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建。 结构型(Structural)模式:处理类与对象间的组合。 行为型(Behavioral)模式:类与对象交互中的职责分配。 从范围来看: 类模式处理类与子类的静态关系。 对象模式处理对象间的动态关系。 二:Singleton(创建型模式)单件 1.动机(Motivation) 软件系...

weixin_33795743的博客 143

华为OD机试 - 文件存储系统的排序 - 深度优先搜索dfs(Java 双机位C卷 200分)

华为OD机试 双机位C卷题库疯狂收录中,刷题。

学Java,找哪吒 719

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C#面向对象设计模式纵横谈(2): Singleton单件(创建型模式)

讲师:李建忠模式分类从目的来看:– 创建型(Creational)模式:负责对象创建。– 结构型(Structural)模式:处理类与对象间的组合。– 行为型(Behavioral)模式:类与对象交互中的职责分配。从范围来看:– 类模式处理类与子类的静态关系。– 对象模式处理对象间的动态关系。动机(Motivation)在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实

足迹 1281

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《C#面向对象设计模式纵横谈》——2、Singleton单件(创建型模式)|第二讲

应用场景: 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。   这是类设计者的责任,而不是使用者的责任。   保证一个类仅有一个实例,并提供一个该实例的全局访问点。           ——《设计模式》GoF   代码实现如下: //单线程Singleton示例: public class Sing...

weixin_34233618的博客 125

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[导入]C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式).zip(9.57 MB)

讲座内容: 本培训课程探讨GoF23之Singleton 单件模式的意图、动因、原理、应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用。 课程讲师: 李建忠 上海祝成信息科技有限公司 高级培训讲师 MSDN特邀讲师 .NET技术专家,C++/CLI 专栏作家。南京邮电学院毕业,历任程序员,高级程序员,开发主管。现为上海祝成科技软件架构师,高级培训讲师。译著Microso...

weixin_30674525的博客 77

c#面向对象设计模式纵横谈--Singleton单件(创建型模式)

  Singleton单件是一种比较简单的创建型模式。模式从目的来看可以分为三类:第一类是创建型应用模式,主要负责对象的创建;第二类是结构型应用模式,用来处理类与对象之间的组合;第三类是行为型应用模式,用来处理类与对象之间的职责分配。从范围来看,类模式用来处理类与子类的静态关系,而对象模型用来处理对象间的动态关系。 Singleton模式的动机是在软件系统中, 经常有这样的...

dielianhuan1546的博客 204

多线程Singleton单件模式

多线程Singleton单件模式 Singleton模式是最简单的模式,比较汗颜的是自己一直以来使用的是单线程的Singleton模式,最近在听了李建忠老师的模式讲座录像后,才发现自己一直没注意到这点。这个录像讲座在后面给出了链接地址: C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 下面内容整理自李建忠老师的讲课内容: 单线程的Singleton模

冷丶Feng 1万+

C#面向对象设计模式纵横谈(听课安排)

 C#面向对象设计模式纵横谈(1):面向对象设计模式与原则 (Level 300)   讲  师:李建忠  上海祝成信息科技有限公司 高级培训讲师 MSDN特邀讲师   课程简介:本培训课程从总体介绍面向对象设计模式的基本概念和原则,并演示面向对象设计模式在.NET框架程序设计中的实践应用。     推荐指数: 2007/08/27    C#面向对象设计模式纵横谈(2):Singleton 单件

749

C#面向对象设计模式:Singleton 单件(创建型模式)

最近在听微软WebCast网络系列讲座之C#面向对象设计模式纵横谈,初步了解了设计模式的基本知识,现在简单的做一下每种模式笔记,供以后开发过程中作一参考。模式分类从目的来看:– 创建型(Creational)模式:负责对象创建。– 结构型(Structural)模式:处理类与对象间的组合。– 行为型(Behavioral)模式:类与对象交互中的职责分配。从范围来看:– 类模式处理类与子类的静态

【一路格桑花】 1388

C#面向对象设计模式纵横谈系列课程

C#面向对象设计模式纵横谈系列课程 C#面向对象设计模式纵横谈(1):面向对象设计模式与原则 (Level 300) 讲  师:李建忠   课程简介:本培训课程从总体介绍面向对象设计模式的基本概念和原则,并演示面向对象设计模式在.NET框架程序设计中的实践应用。   推

jinnee_cumtb的专栏 881

C#面向对象设计模式纵横谈

http://115.com/file/bhifcm6d# C#面向对象设计模式纵横谈(1):面向对象设计模式与原则.rar http://115.com/file/bhifcvb4# C#面向对象设计模式纵横谈(2):Singleton_单件(创建型模式).rar http://115.com/file/aqky0l4l# C#面向对象设计模式纵横谈(3):Abs...

weixin_34152820的博客 173

MSDN李建忠C#面向对象设计模式纵横谈

教程简介 w C#面向对象设计模式纵横谈是MSDN特邀教师李建忠倾ebcast系列教程之一。。这个系列的教程虽然是用C#语言描述的,但是对于使用其他面向对象对象语言的程序员来说也有很强的指导意义。毕竟教程旨在讲解面向对象设计模式,不是关注语言细节的。终于也让我们这些java程序员能够利用一下微软丰富的学习资源吧! 教程难度被划分至level300,属于高级资料的技术等级。假设...

weixin_30487317的博客 426

多线程Singleton单件模式收藏

多线程Singleton单件模式收藏 Singleton模式是最简单的模式,比较汗颜的是自己一直以来使用的是单线程的Singleton模式,最近在听了李建忠老师的模式讲座录像后,才发现自己一直没注意到这点。这个录像讲座在后面给出了链接地址: C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 下面内容整理自李建忠老师的讲课内容: 单线程的Singleton模式 ...

qiuyabing的专栏 129

C#面向对象设计模式纵横谈——Singleton单件(创建型模式)

Singleton单件(创建型模式) 动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设计者的责任,而不是使用者的责任。 意图(Intent) 保证一个类仅有一个实例,并提供一个该实例的全局访问点。 结构(Structure...

weixin_30894583的博客 151
上一篇: C#面向对象设计模式纵横谈1
下一篇: C#面向对象设计模式纵横谈3 AbstractFactory抽象工厂模式创建型模式
沈的军
博客等级 码龄11年 1粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值