设计模式-单例模式
说明
作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
实现说明
定义: 一个类 只能允许有 一个对象存在.
1.使类不能被实例化
2.创建一个允许外部访问的静态方法
3.在静态方法里实例化该类
4.禁止覆盖产生对象
5.禁止clone产生对象
<h5>常用场景</h5>
在日常开发中缓存对象、日志对象、数据库操作对象等全局操作对象常被设计成单例。
单例模式实现过程
<h5>使类不能被实例化</h5>
//封锁new方法
class sigle{
protected function __construct()
{
}
}
<h5>在静态方法里实例化该类</h5>
class sigle{
protected function __construct()
{
}
public static function getIns(){
return new self();
}
}
<h5>创建一个允许外部访问的静态方法</h5>
class sigle{
protected static $ins = null; //存储类
protected function __construct()
{
}
public static function getIns(){
if(self::$ins == null){
self::$ins = new self();
}
return self::$ins;
}
}
<h5>禁止覆盖产生对象</h5>
//方法前加final,则方法不能呗覆盖,类之前加final,则类不能被继承
class sigle{
protected static $ins = null;
final protected function __construct()
{
}
public static function getIns(){
if(self::$ins == null){
self::$ins = new self();
}
return self::$ins;
}
}
<h5>防止clone产生新对象</h5>
class sigle{
protected static $ins = null;
//禁止外部直接创建对象,禁止继承后覆盖
final protected function __construct()
{
}
//禁止外部直接clone对象,禁止继承后覆盖
final protected function __clone()
{
// TODO: Implement __clone() method.
}
public static function getIns(){
if(self::$ins == null){
self::$ins = new self();
}
return self::$ins;
}
}
<h5>测试</h5>
class sigle{
protected static $ins = null;
//禁止外部直接创建对象,禁止继承后覆盖
final protected function __construct()
{
}
//禁止外部直接clone对象,禁止继承后覆盖
final protected function __clone()
{
// TODO: Implement __clone() method.
}
public static function getIns(){
if(self::$ins == null){
self::$ins = new self();
}
return self::$ins;
}
}
$s1=sigle::getIns();
$s2=sigle::getIns();
if($s1 === $s2){
echo "s1和s2是一个对象";
}else{
echo "s1和s2不是一个对象";
}
结果:
object(sigle)#1 (0) { }
object(sigle)#1 (0) { }
s1和s2是一个对象
结尾
心如花木,向阳而生。