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

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

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

示例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.有了静态类,为什么还要有“单例”?

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

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

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

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

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

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

时间: 2024-11-06 07:17:28

面向对象编程思想-单例模式的相关文章

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想(OOP)(转发)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想的哲学起源(转载)

http://www.xuebuyuan.com/566309.html 本来想象着写一整篇「面向对象编程思想的哲学起源」这样的题目,笔走纸上,方才发现这样的题目足够出本书,知识不够,写不动.但心里还是想写点自己的所思所想. 全篇就拿JAVA来举例了.众所周知,面向对象的四大基本要素:抽象(Abstract).封装(Encapsulation).继承(Inheritance).多态(Polymorphism). 很多人坚持<逻辑学>是唯物哲学的基础,不懂,姑且不论.哲学就是对自然学科的抽象,看

面向对象编程思想(前传)--你必须知道的javascript(转载)

原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 call apply band js中的闭包 什么是高阶函数 在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 javascript是一门典型的动态类型语

面向对象编程思想 - 月亮晶石的日志 - 网易博客

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计. 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统).这可以使系统直接地映射问题域,保

[Javascript] 面向对象编程思想

1.创建对象 1.1 new 用new进行创建对象: var user = new Object(); user.age = 12;//同时为对象添加属性 user.name = 'ajun'; 1.2{} 用{}创建对象,如: var user = { 'name':'ajun, 'age':12 } 这里同时候为user添加了两个属性分别为:name,age 在以上代码稍加改造,你还可以为一个对象添加一个方法,如: var user = { 'name':'ajun', 'age':12 '

第三章面向对象编程思想

""" 编码规范: 类名首字母应以大写字母开头 类的成员/属性: 成员属性 实例化对象的属性: self.name=name 可以被访问,也可以在类的外部被修改 私有属性 实例化对象的私有属性: self.__age=age 属性名前加两下划线 外部无法被访问, 也不能被修改,只能内部访问和修改 想要在外部访问只能自定义一个方法了 强制访问 私有属性: p._People__age 对象名._类名__私有属性 公共属性: 类的属性,也叫静态属性,他是在类的内部定义的 clas

面向对象编程思想2s

面向对象编程思想 抽象 封装和数据隐藏 多态 继承 代码的可复用性 面向对象分析 五个层次.五个活动组成 目的 1.获得系统的对象个体.个体内部的状态.个体与个体间的交互 活动 1.建模系统功能 2.发现并且确定业务对象 3.组织对象并确定其关系 抽象 舍弃个别的.非本质的特征,抽取共同的.本质的特征 ss 原文地址:https://www.cnblogs.com/cnblogzaizai/p/12028791.html