单例模式是指整个应用中类只有一个对象实例的设计模式。
使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
每次用 new 类名 的方式,就可以创建一个对象。我们必须禁止外部程序用 new 类名的方式来创建多个实例。
解决办法是:我们将构造函数设置成 private ,让构造函数只能在内部被调用,而外部不能调用。这样,这个类就不能被外部用 new 的方式建立多个实例了。
经典的设计模式主要有2种:懒汉式和饿汉式。下面分别展示代码。
懒汉式:
懒汉式单例模式既在需要的时候才创建单例对象,即“用时间换空间”。
//懒汉式 class Single { static private $instance = null;//声明一个静态变量(保存在类中唯一的一个实例) private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。 } static public function getInstance(){//声明一个getInstance()静态方法,用于检测是否有实例对象 if(self::$instance == null) { self::$instance = new self(); } return self::$instance; } } $instance = Single::getInstance();//得到实例
饿汉式:
饿汉式的特点是一开始就创建实例,即“用空间换时间”
php有一个特性,不支持在类定义时给类的成员变量赋予非基本类型的值。如表达式,new操作等等。故我目前还无法实现php的饿汉式单例。下面用Java实现一下:
//饿汉式单例模式 public class Single2 { //设立静态变量,直接创建实例 private static Single2 Single = new Single2(); private Singlet2(){ //私有化构造函数 } //开放一个公有方法,返回实例 public static Single2 getInstance(){ return Single; } }