1、单态模式的主要作用是保证在面向对象编程设计中,一个类智能有一个实例对象存在。在很多操作中,比如建立目录、数据库连接都有可能会用到这种技术。和其他面向对象的编程语言相比,php中是用单态设计尤为重要。因为php是脚本语言,每次访问都是一次独立执行的过程,而在这个过程中一个类有一个实例对象就足够了。例如,自定义数据的操作类,设计的原则就是在一个脚本中,只需要实例化一个数据库操作类的对象,并且只连接一次数据库就可以了,而不是一个脚本中执行多个SQL语句,单独为每个SQL语句实例一个对象,因为实例化一次就要连接一次数据库,这样效率非常低,单态模式就为我们提供了这样实现的功能。另外,使用单态的另一个好处在于可以节省内存,因为它限制了实例对象的个数。
2、<?php/*声明一个类DB,用于演示单态模式的使用*/Class DB{Private static $obj =null; //声明一个私有的,静态的成员属性$obj//构件方法 ,使用private封装后则只能在类的内部使用new去创建对象Private function __construct(){ Echo “连接数据库成功”;}Static function getInstance(){If(is_null(self::$obj)){ Self::$obj= new self();Return self::$obj;}Function query($sql){ Echo $sql;}}$db = DB::getInstance();$db->query(“select * from user”);?>
3、要编写单态设计模式,就必须让一个类只能实例化一个对象,而要想让一个类只能实例化一个对象,就先要让一个类不能实例化对象。不能在类的外部直接是用new关键字去实例化DB类的对象,是因为DB类的构造方法使用了private关键字进行了封装。但根据封装的原则我们可以在类的内部方法中实例化本类的对象那个,所以声明了一个方法getInstance()方法,并在该访问中实例化本类对象。但成员方法也是需要对象才能访问的,所以在getInstance()方法前使用了static关键字修饰,成为静态方法就不使用对象而是通过类名访问了。如果调用一次getInstance()方法,就在该方法内实例化一次本类对象,这并不是我们想要的结果。所以就需要声明一个成员属性$obj,将实例化的对象引用赋值给它,再判断该变量,如果已经有值,就直接返回,如果值为null,就去实例化对象,这样就能保证DB类只能被实例化一次。有因为getInstance()方法时static修饰的静态方法,静态方法不能访问非静态的成员,所以成员属性$obj也必须是一个静态成员,而且又不想让类外部直接访问,所以也需要使用private关键字修饰封装