> **设计模式-单例模式**
## 说明 ##
**作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。**
----------
##实现说明##
定义: 一个类 只能允许有 一个对象存在.
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是一个对象
## 结尾 ##
<p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;">
心如花木,向阳而生。
</p>
[1]: https://blog.zxliu.cn/usr/uploads/2020/11/386091710.png
[2]: https://blog.zxliu.cn/usr/uploads/2020/11/1966401635.png