Net设计模式实例之单例模式( Singleton Pattern)

简介:

一、单例模式简介(Brief Introduction

单例模式(Singleton Pattern,保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。

二、解决的问题(What To Solve

当一个类只允许创建一个实例时,可以考虑使用单例模式。      

三、单例模式分析(Analysis

1、单例模式结构

 

Singleton,定义一个私有变量instance;私有构造方法Singleton()和方法GetInstance();

私有变量instance:

private static Singleton instance;

私有构造方法Singleton(),外界不能使用new关键字来创建此类的实例了。

private Singleton()

{

}

方法GetInstance(), 此方法是本类实例的唯一全局访问点。

public static Singleton GetInstance()

{

    //如实例不存在,则New一个新实例,否则返回已有实例

    if (instance == nu ll )

    {

        instance = new Singleton();

    }

    return instance;

}

2、代码

1、单例模式类Singleton

public class Singleton

{

    private static Singleton instance;

 

    /// <summary>

    /// 程序运行时,创建一个静态只读的进程辅助对象

    /// </summary>

    private static readonly object _object = new object();

 

    /// <summary>

    /// 构造方法私有,外键不能通过New类实例化此类

    /// </summary>

    private Singleton()

    {

    }

    /// <summary>

    /// 此方法是本类实例的唯一全局访问点

    /// (双重加锁 Double-Check Locking

    /// </summary>

    /// <returns></returns>

    public static Singleton GetInstance()

    {

        //先判断实例是否存在,不存在再加锁处理

        if (instance == nu ll )

        {

            //在同一时刻加了锁的那部分程序只有一个线程可以进入,

            lock (_object)

            {

                //如实例不存在,则New一个新实例,否则返回已有实例

                if (instance == nu ll )

                {

                    instance = new Singleton();

                }

            }

        }

        return instance;

    }

}

 

2、客户端代码

static void  Main (string[] args)

{

    Singleton singleton1 = Singleton.GetInstance();

    Singleton singleton2 = Singleton.GetInstance();

    if (singleton1 ==singleton2)

    {

        Console.WriteLine("实例singleton1与实例singleton2相同!");

    }

    Console.ReadKey();

}

3、实例运行结果

 

四.实例分析(Example

1、场景

Mail发送机制中,需要对已经发送的消息做Log。同一时间内只允许一个进程对Txt文档进行操作,此时使用单例模式比较合适。结构如下图所示

 

WriteMai lL og(string message) 方法:纪录Mail发送日志到文件.

_helper _fileLock:程序运行时,创建2个静态只读的进程辅助对象

2、代码

1、类Mai lL og

public class Emai lL og

{

    private static object _helper = new object();

    private static Emai lL og _instance;

    private static object _fileLock = new object();

 

    private Emai lL og()

    {}

 

    public static Emai lL og GetInstance()

    {

        lock (_helper)

        {

            if (_instance == nu ll )

            {

                _instance = new Emai lL og();

            }

        }

        return _instance;

    }

 

    /// <summary>

    /// 发送Mail日志

    /// </summary>

    /// <param name="message">信息</param>

    public void WriteEmai lL og(string message)

    {

        string filePath = System.AppDomain.CurrentDomain.BaseDirectory +"mail.txt";

        StreamWriter sw = nu ll ;

        FileStream fs = nu ll ;

        lock (_fileLock)

        {

            if (!File.Exists(filePath))

            {

                fs = System.IO.File.Create(filePath);

                sw = new StreamWriter(fs, Encoding.UTF8);

                sw.WriteLine("--------------------------------------------------------------------------");

                sw.WriteLine(message);

                sw.Flush();

                sw.Close();

            }

            else

            {

                fs = new FileStream(filePath, FileMode.Append);

                sw = new StreamWriter(fs, Encoding.UTF8);

                sw.WriteLine("--------------------------------------------------------------------------");

                sw.WriteLine(message);

                sw.Flush();

                sw.Close();

            }

        }

    }

}

 

2、客户端代码

static void  Main (string[] args)

{

    Emai lL og w1 = Emai lL og.GetInstance();

    w1.WriteEmai lL og("发送Mail给灵动生活...");

    Emai lL og w2 = Emai lL og.GetInstance();

    w2.WriteEmai lL og("发送MailJames Hao...");

}

3、实例运行结果

五、总结(Summary

本文对单例模式(Singleton Pattern)的概念及其设计结构图简单地进行了描述,同样也以一个Mail机制的LOG实例进行了说明。单例模式是比较常用。比较简单的设计模式。



本文转自灵动生活博客园博客,原文链接: http://www.cnblogs.com/ywqu/archive/2010/01/13/1646009.html ,如需转载请自行联系原作者

相关文章
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
428 15
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
299 4
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
631 26
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
312 2
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
设计模式 安全 Java
设计模式--单例模式Singleton
这篇文章详细介绍了单例模式Singleton的八种实现方式,包括饿汉式(静态常量和静态代码块)、懒汉式(线程不安全和线程安全的同步方法、同步代码块)、双重检查、静态内部类和枚举。每种方式都有详细的代码示例和优缺点说明,帮助理解单例模式的应用和选择适合的实现方法。
设计模式--单例模式Singleton