单例设计模式那些事儿

单例设计模式是最常用的设计模式之一。单例设计模式,单就其名字就可以大概知道其意义。单,也就是一个;例,也就是实例对象。所以说单例就是只有一个实例化对象。因此我们可以对单例设计模式作如下的定义:

单例设计模式用于限定某个特定对象只能被创建一次,并且向整个系统提供对自身共享访问。

单例设计模式一般只允许创建自身的一个实例,因此在最初实例化的时候,会创建一个对象存储在自身内部。在接下来使用该对象的时候,该对象都会先检查存储器查看是否已经实例化了该对象,如果已经具有自身的实例,那么就返回引用,否则就按照上面所说创建自身的一个对象存储在自身内部供请求使用。

单例设计模式的原理可以说就是上面所说的,可以说它是独立于编程语言的。但是由于不同的编程语言其语法的差异,导致单例设计模式的实现也有所不同,我们就拿Java和PHP为例来说明一下。

对于Java,单例设计模式根据实例化对象的时间的不同可以分为懒汉式和饿汉式。

所谓饿汉式单例就是说当单例类被加载的时候就实例化一个自身对象存储在自身内部。

代码如下:

public class Singleton{

         private static Singleton singleton = new Singleton();

         private Singleton(){}

         public static Singleton __Instance(){

                   return singleton;

         }       

}

通过以上代码我们看到在类开始加载的时候,就声明了一个private static 变量 singleton,并且实例化了自身的对象,将该对象赋值给变量 singleton。这就是所谓的饿汉式单例。

所谓懒汉式单例就是说只有在调用产生实例对象的方法时才会去实例化自身对象,并将其存储在自身内部。

代码如下:

public class Singleton {

    private static Singleton singleton;

    private Singleton(){}

    public static synchronized Singleton __Instance(){

        if(singleton==null){

            singleton = new Singleton();

        }

        return singleton;

    }

}

以上代码可以看到只有当调用__Instance()方法的时候首先会判断变量 singleton是否为空,如果不为空说明实例化对象已经被创建,否则创建实例化对象赋值给变量singleton。

以上是Java的代码,因为Java是编译型的语言,所以它支持在类加载时就实例化该对象。

但是对于PHP来说,PHP是解释型语言,在类没有加载完成,它是不能实例化该类的对象的,所以说PHP不支持饿汉式单例,也就是说以下代码有错误无法通过的。

class Singleton{

         private static $singleton = new self;

         private function __construct(){}

         public static function __Instance(){

                   return self::$singleton;

         }

}

因此PHP只支持懒汉式单例,代码如下:

class Singleton{

         private static $singleton;

         private function __construct(){}

         public static function __Instance(){

                   if(!self::$singleton instanceof self){

                         self::$singleton = new self;

                   }

                   return self::$singleton;

         }       

}

使用单例设计模式最常用的场景就是创建连接数据库对象。数据库访问对象是用来负责创建一个数据库连接实例的。无论何时只要调用该对象的特定方法,它就会使用它已经创建的连接资源。众所周知创建一个数据库连接资源的花销是很大的(需要花销很多的时间和资源)。因此在设计代码的时候应该尽可能少的去创建数据库连接资源。

对于大多数情况下,当数据库的数据被取出以后,数据库连接资源没有必要继续保存着了,可以释放掉。鉴于这种情况,将数据库访问对象变成单例是很有意义的。当每次有新的数据操作需要一个新的数据库访问对象的时候,先前的对象会被重复使用,不用再去实例化一个新的数据库访问对象去额外的建立数据库连接资源了。

因此我们可以知道,使用单例设计模式可以节省内存空间,避免了重复创建和销毁对象,提高了性能等等。

因为,单例设计模式经常被应用于连接数据库,所以我写了一个操作数据库的类,该类在设计的时候尝试使用了单例设计模式。

源码托管在github上,并且对于类的功能的使用有简单的介绍,欢迎大家下载。

 

本文转载自:迹忆客(https://www.jiyik.com)

以上是 单例设计模式那些事儿 的全部内容, 来源链接: utcz.com/z/290034.html

回到顶部