• 设计模式之个人理解单例模式


    单例模式

    面向过程(C)语言中可以在程序中应用全局变量,而面向对象(C++,C#,JAVA)语言中不再存在全局变量。

    为了在程序中应用一个全局访问点(全局变量)也就产生了单例模式,在Gof四人设计模式中对单例模式这样定义

      保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    根据定义,它有两重意思,1,一个类仅有一个实例,2,可以在全局范围内进行访问:

    根据这连个点可以进行如下思考,只有一个实例,也就是在全局范围内只实例化一次,面向对象语言的一个特性就是

    对象,类可以创建对象,而单例模式中只有一个实例,如何可以实现只实例化一次了???

      类实例化本质就是调用构造函数,如果能够将构造函数的访问限制由public改为private的时候,外部就无法创建

    类的实例,但是类的函数可以调用私有的构造函数,考虑到类的实例都没有,实例函数就更无法调用了,这个问题就

    成了一个死循环的问题了,如何解决了???

      实例函数无法调用,那么我们可以考虑类中的静态函数,这时静态函数不需要进行实例化,在静态函数中就可以

    进行实例化了,同样静态函数每调用一次都会生成一个类实例:

    public class Singlton
    {
        
    //private constructor
        private Singlton(){}
        
    public static Singlton  Instance()
        {
            
    //call private constructor;
         }
    }
        

    那么在调用一次私有构造函数的时候就生成一个类的实例,那就和不用私有构造函数直接生成类实例一样了,为了保证

    类仅有一个实例怎么解决这个问题了???

      如果在类中添加一个静态的指向自己的引用,

    private static Singlton instance;

    那么在调用静态函数中对这个引用仅作一次赋值,然后每次返回这个引用,这样就可以实现单例模式了,代码如下:

    代码
    public class Singlton
    {
        
    //static instance;
        private static Singlton instance;
        
    //private constructor
        private Singlton(){}
        
    //only open function for call
        public static Singlton Instance()
        {
            
    //only one object;
            if(instance==null)
            {
                instance
    =new Singlton();
            }
            
    return instance;
        }
    }

    这样就可以实现了一个全局的访问点,当静态函数第一次调用的时候就产生了一个全局访问点

    对单例模式的深入研究可以考虑:

    1,多线程同时访问同一一个实例的同步问题

    2,单例模式的扩展单例泛型

    3,单例产生的全局访问点实例的回收问题

    。。。。。。

  • 相关阅读:
    MySQL约束笔记
    MySQL 存储过程入门
    数据库范式
    Hibernate 懒加载 错误----no session
    复选框 checkbox 选中事件
    Hibernate 三种状态变化 与 sql 语句的关系
    Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况
    35个java代码性能优化总结
    为什么 Java中1000==1000为false而100==100为true?AND "2+2=5"?
    MyBatis对象关联关系----多对多的保存与查询
  • 原文地址:https://www.cnblogs.com/xingyayang/p/1615427.html
Copyright © 2020-2023  润新知