PHP單例模式與工廠模式詳解
一、單例模式又稱為職責(zé)模式,它用來在程序中創(chuàng)建一個(gè)單一功能的訪問點(diǎn),通俗地說就是實(shí)例化出來的對(duì)象是唯一的。
所有的單例模式至少擁有以下三種公共元素:
1. 它們必須擁有一個(gè)構(gòu)造函數(shù),并且必須被標(biāo)記為private
2. 它們擁有一個(gè)保存類的實(shí)例的靜態(tài)成員變量
3. 它們擁有一個(gè)訪問這個(gè)實(shí)例的公共的靜態(tài)方法
單例類不能再其它類中直接實(shí)例化,只能被其自身實(shí)例化。它不會(huì)創(chuàng)建實(shí)例副本,而是會(huì)向單例類內(nèi)部存儲(chǔ)的實(shí)例返回一個(gè)引用。
單例模式實(shí)例
<?php
class Single {
private $name;//聲明一個(gè)私有的實(shí)例變量
private function __construct(){//聲明私有構(gòu)造方法為了防止外部代碼使用new來創(chuàng)建對(duì)象。
}
static public $instance;//聲明一個(gè)靜態(tài)變量(保存在類中唯一的一個(gè)實(shí)例)
static public function getinstance(){//聲明一個(gè)getinstance()靜態(tài)方法,用于檢測(cè)是否有實(shí)例對(duì)象
if(!self::$instance) self::$instance = new self();
return self::$instance;
}
public function setname($n){ //給變量$name賦值
$this->name = $n;
}
public function getname(){ //取變量$name的值
return $this->name;
}
}
$a = Single::getinstance();
$b = Single::getinstance();
$a->setname('hello world');
$b->setname('good morning');
echo $a->getname();//good morning
echo $b->getname();//good morning
?>
二、工廠模式就是一種類,具有為您創(chuàng)建對(duì)象的某些方法,這樣就可以使用工廠類創(chuàng)建對(duì)象,而不直接使用new。
這樣如果想更改創(chuàng)建的對(duì)象類型,只需更改該工廠即可。
<?php
//工廠類(關(guān)于運(yùn)算符的操作)
class factory{
public static function dx($ope){
switch($ope){
case "+":
return new plus();
break;
case "-":
return new sub();
break;
case "%":
return new rem();
break;
}
}
}
$ope = factory::dx("+");
$ope->a = 20;
$ope->b = 10;
echo $ope->opera();
工廠模式實(shí)例
class Factory {//創(chuàng)建一個(gè)基本的工廠類
static public function fac($id){//創(chuàng)建一個(gè)返回對(duì)象實(shí)例的靜態(tài)方法
if(1 == $id) return new A();
elseif(2==$id) return new B();
elseif(3==$id) return new C();
return new D();
}
}
interface FetchName {//創(chuàng)建一個(gè)接口
public function getname();//
}
class A implements FetchName{
private $name = "AAAAA";
public function getname(){
return $this->name;
}
}
class C implements FetchName{
private $name = "CCCCC";
public function getname(){
return $this->name;
}
}
class B implements FetchName{
private $name = "BBBBB";
public function getname(){
return $this->name;
}
}
class D implements FetchName{
private $name = "DDDDD";
public function getname(){
return $this->name;
}
}
$o = Factory::fac(6);//調(diào)用工廠類中的方法
if($o instanceof FetchName){
echo $o->getname();//DDDDD
}
$p=Factory::fac(3);
echo $p->getname();//CCCCC
?>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于thinkPHP實(shí)現(xiàn)的微信自定義分享功能示例
這篇文章主要介紹了基于thinkPHP實(shí)現(xiàn)的微信自定義分享功能,結(jié)合實(shí)例形式分析了thinkPHP調(diào)用微信接口實(shí)現(xiàn)自定義分享功能的相關(guān)操作技巧,需要的朋友可以參考下2016-09-09
php設(shè)計(jì)模式之適配器模式實(shí)例分析【星際爭(zhēng)霸游戲案例】
這篇文章主要介紹了php設(shè)計(jì)模式之適配器模式,結(jié)合星際爭(zhēng)霸游戲案例形式分析了PHP適配器模式相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
web server使用php生成web頁面的三種方法總結(jié)
web server使用php生成web頁面的三種方法。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10
php+ajax做仿百度搜索下拉自動(dòng)提示框(有實(shí)例)
php+mysql+ajax實(shí)現(xiàn)百度搜索下拉提示框 主要有3個(gè)文件三個(gè)文件在同一個(gè)目錄里 如下圖 下面是三個(gè)文件的代碼 把sql文件導(dǎo)入到mysql數(shù)據(jù)庫里 修改下數(shù)據(jù)庫密碼為自己的 記得哦是UTF-8編碼2012-08-08
國產(chǎn)PHP開發(fā)框架myqee新手快速入門教程
這篇文章主要介紹了國產(chǎn)PHP開發(fā)框架myqee新手快速入門教程,myqee中文名稱邁啟PHP框架,有比較多的高級(jí)開發(fā)特性,需要的朋友可以參考下2014-07-07
php 提交表單 關(guān)閉layer彈窗iframe的實(shí)例講解
今天小編就為大家分享一篇php 提交表單 關(guān)閉layer彈窗iframe的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Codeigniter的一些優(yōu)秀特性總結(jié)
本文總結(jié)了一下Codeigniter的一些優(yōu)秀特性,算是個(gè)人的一些心得分享,推薦給大家。2015-01-01
laravel Model 執(zhí)行事務(wù)的實(shí)現(xiàn)
今天小編就為大家分享一篇laravel Model 執(zhí)行事務(wù)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10

