> **設計模式-單例模式**
## 說明 ##
**作為對象的創建模式,單例模式確保某一個類只有一個實例,并且對外提供這個全局實例的訪問入口。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。**
----------
##實現說明##
定義: 一個類 只能允許有 一個對象存在.
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