• 面向对象编程思想-单例模式


    单例模式的定义:只能有一个实例,提供唯一公开、可访问实例的全局访问点

    单例模式的三种实现方式:

    示例1

         private Singleton()
            {
                Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
            }
    private static Singleton m_Singleton = null;
        
    public static Singleton CreateInstance() {
            
    if (m_Singleton == null) {
              //Thread.Sleep(1000); m_Singleton
    = new Singleton(); } return m_Singleton; }

    优点:直到对象要求产生一个实例才执行实例化

    缺点:线程不安全,并发执行时,如果尚未创建实例,会创建多个实例

    示例2

            private Singleton()
            {
                Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
            }
    
            private static readonly Singleton m_Singleton = new Singleton();
    
            public static Singleton CreateInstance()
            {
                return m_Singleton;
            }    

    优点:线程安全

    缺点:静态初始化由CLR执行,缺少实例化机制的控制权 。在程序启动或第一次访问引用了类的任何成员时实例已经被创建。

    示例3

            private Singleton()
            {
                Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
            }
    
            private static Singleton m_Singleton = null;
    
            private static readonly object m_Object = new object();
    
            public static Singleton CreateInstance()
            {
           //提高系统性能。锁会阻塞线程,对象被实例化后不再需要线程排队等待
    if (m_Singleton == null) {
              //保证锁住部分只有一个线程执行
    lock (m_Object) {
                //确保单线程时 对象只被创建一次
    if (m_Singleton == null) { m_Singleton = new Singleton(); } } } return m_Singleton; }

    优点:解决线程并发问题,将实例化延迟到第一次访问对象时发生

    使用场景:系统的任务管理器,配置文件的读取,数据库连接池的设计,多线程的线程池设计,应用程序的日志应用等。

    说到这里有人会问:

    1.有了静态类,为什么还要有“单例”?

    静态类是一种语法,而单例模式是一种思想。

    静态类不可以继承类或实现接口。

    静态类中不能声明实例成员。即静态类中所有的字段,属性,方法等都必须是静态的。

    无法控制静态成员的初始化。 

    设计模式是前人不断尝试、改进后提炼出来的思想。但我们不要生搬硬套,适合的才是最好的。在此,关于单例模式的学习到此结束。谢谢您的阅读

    由于博主能力有限,文中可能存在不正确的地方,欢迎斧正,补充。        

  • 相关阅读:
    做足以让自己骄傲的活
    Count(*) 与 count(field) 一样吗?
    Explain Plan试分析
    Oracle SQL Developer中查看解释计划Explain Plan的两种方法
    整理+学习《骆昊-Java面试题全集(上)》
    【转】Java就业指导
    如何清晰的、高质量的给面试官介绍自己的电商项目【借鉴】
    留存的图片
    Linux学习_006_JavaEE程序员常用linux命令整理
    给Linux初学者的七个建议,值得一读
  • 原文地址:https://www.cnblogs.com/jdzhang/p/6895311.html
Copyright © 2020-2023  润新知