亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP中常用的三種設計模式詳解【單例模式、工廠模式、觀察者模式】

2024-05-05 00:09:37
字體:
來源:轉載
供稿:網友

本文實例講述了PHP中常用的三種設計模式。分享給大家供大家參考,具體如下:

PHP中常用的三種設計模式:單例模式、工廠模式、觀察者模式

1.單例模式

為何要使用PHP單例模式?

多數人都是從單例模式的字面上的意思來理解它的用途, 認為這是對系統資源的節省, 可以避免重復實例化, 是一種”計劃生育”. 而PHP每次執行完頁面都是會從內存中清理掉所有的資源. 因而PHP中的單例實際每次運行都是需要重新實例化的, 這樣就失去了單例重復實例化的意義了. 單單從這個方面來說, PHP的單例的確有點讓各位失望. 但是單例僅僅只有這個功能和應用嗎? 答案是否定的。

  1. php的應用主要在于數據庫應用, 所以一個應用中會存在大量的數據庫操作, 在使用面向對象的方式開發時(廢話), 如果使用單例模式, 則可以避免大量的new 操作消耗的資源。
  2. 如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現. 這個可以參看zend Framework的FrontController部分。
  3. 在一次頁面請求中, 便于進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日志,從而避免到處var_dump, echo。

一個單例類應包括以下幾點:

和普通類不同,單例類不能被直接實例化,只能是由自身實例化。因此,要獲得這樣的限制效果,構造函數必須標記為private。

要讓單例類不被直接實例化而能起到作用,就必須為其提供這樣的一個實例。因此,就必須要讓單例類擁有一個能保存類的實例的私有靜態成員變量和對應的一個能訪問到實例的公共靜態方法。

在PHP中,為防止對單例類對象的克隆來打破單例類的上述實現形式,通常還為其提供一個空的私有__clone()方法。

對于一個類的對象,如果使用“clone運算符”,就會復制出一個和當前對象完全一樣的新對象出來,并且,此時還會自動調用該類的魔術方法:__clone()(只要該類中有該方法)。

則要實現單例類,就應該對這個單例類的對象“禁止克隆”,用private來修飾__clone()來實現禁止克隆,具體可參考單例類的加強:禁止克隆。

單例模式的例子:

<?php/*** 設計模式之單例模式* $instance必須聲明為靜態的私有變量* 構造函數和析構函數必須聲明為私有,防止外部程序new* 類從而失去單例模式的意義* getInstance()方法必須設置為公有的,必須調用此方法* 以返回實例的一個引用* ::操作符只能訪問靜態變量和靜態函數* new對象都會消耗內存* 使用場景:最常用的地方是數據庫連接。* 使用單例模式生成一個對象后,* 該對象可以被其它眾多對象所使用。*/class SingetonBasic {private static $instance; //靜態變量要私有化,防止類外修改// other vars..private function __construct() {  //構造函數私有化,類外不能直接新建對象  // do construct..}private function __clone() {}  //在__clone()前用private修飾,用來禁止克隆public static function getInstance() { //公共的靜態方法,public——外部的接口,static——不使用對象而是通過類名訪問  if (!(self::$instance instanceof self)) { //私有靜態變量$instance為空    self::$instance = new self(); //新建為自身的對象,并賦值給私有變量$instance  }  return self::$instance; //返回私有變量$instance}// other functions..}$a = SingetonBasic::getInstance();$b = SingetonBasic::getInstance();var_dump($a === $b);  //結果為:boolean true//?>
<?php/** * php單例,單例模式為何只能實例化一次*/class Example{  // 保存類實例在此屬性中  private static $instance;  // 構造方法聲明為private,防止直接創建對象  private function __construct(){    echo 'I am constructed';  }  // singleton 方法  public static function singleton(){    if (!isset(self::$instance)) {//判斷是否以前創建了當前類的實例      $c = __CLASS__;//獲取類名      self::$instance = new $c;//如果沒有創建,實例化當前類,這里實現類只實例化一次    }    return self::$instance;//返回類的實例  }  // Example類中的普通方法  public function bark(){    echo 'Woof!';  }  // 阻止用戶復制對象實例  public function __clone(){    trigger_error('Clone is not allowed.', E_USER_ERROR);  }}// 這個寫法會出錯,因為構造方法被聲明為private$test = new Example;// 下面將得到Example類的單例對象$test = Example::singleton();$test->bark();// 下面將得到Example類的單例對象$test = Example::singleton();$test->bark();// 復制對象將導致一個E_USER_ERROR.$test_clone = clone $test;?>

 

2. 工廠模式

工廠模式在于可以根據輸入參數或者應用程序配置的不同來創建一種專門用來實現化并返回其它類的實例的類。

工廠模式的例子:

<?phpclass FactoryBasic {  public static function create($config) {  }}

比如這里是一個描述形狀對象的工廠,它希望根據傳入的參數個數不同來創建不同的形狀。

<?php// 定義形狀的公共功能:獲取周長和面積。interface IShape {  function getCircum();  function getArea();}// 定義矩形類class Rectangle implements IShape {  private $width, $height;  public function __construct($width, $height) {    $this->width = $width;    $this->height = $height;  }  public function getCircum() {    return 2 * ($this->width + $this->height);  }  public function getArea() {    return $this->width * $this->height;  }}// 定義圓類class Circle implements IShape {  private $radii;  public function __construct($radii) {    $this->radii = $radii;  }  public function getCircum() {    return 2 * M_PI * $this->radii;  }  public function getArea() {    return M_PI * pow($this->radii, 2);  }}// 根據傳入的參數個數不同來創建不同的形狀。class FactoryShape {  public static function create() {    switch (func_num_args()) {      case 1:      return new Circle(func_get_arg(0));      break;      case 2:      return new Rectangle(func_get_arg(0), func_get_arg(1));      break;    }  }}// 矩形對象$c = FactoryShape::create(4, 2);var_dump($c->getArea());// 圓對象$o = FactoryShape::create(2);var_dump($o->getArea());

使用工廠模式使得在調用方法時變得更容易,因為它只有一個類和一個方法,若沒有使用工廠模式,則要在調用時決定應該調用哪個類和哪個方法;使用工廠模式還使得未來對應用程序做改變時更加容易,比如要增加一種形狀的支持,只需要修改工廠類中的create()一個方法,而沒有使用工廠模式,則要修改調用形狀的代碼塊。

3. 觀察者模式

觀察者模式為您提供了避免組件之間緊密耦合的另一種方法。該模式非常簡單:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已注冊的觀察者。這些觀察者使用該信息執行的操作與可觀察的對象無關。結果是對象可以相互對話,而不必了解原因。

一個簡單的示例:當聽眾在收聽電臺時(即電臺加入一個新聽眾),它將發送出一條提示消息,通過發送消息的日志觀察者可以觀察這些消息。

<?php// 觀察者接口interface IObserver {  function onListen($sender, $args);  function getName();}// 可被觀察接口interface IObservable {  function addObserver($observer);  function removeObserver($observer_name);}// 觀察者類abstract class Observer implements IObserver {  protected $name;  public function getName() {    return $this->name;  }}// 可被觀察類class Observable implements IObservable {  protected $observers = array();  public function addObserver($observer) {    if (!($observer instanceof IObserver)) {      return;    }    $this->observers[] = $observer;  }  public function removeObserver($observer_name) {    foreach ($this->observers as $index => $observer) {      if ($observer->getName() === $observer_name) {        array_splice($this->observers, $index, 1);        return;      }    }  }}// 模擬一個可以被觀察的類:RadioStationclass RadioStation extends Observable {  public function addListener($listener) {    foreach ($this->observers as $observer) {      $observer->onListen($this, $listener);    }  }}// 模擬一個觀察者類class RadioStationLogger extends Observer {  protected $name = 'logger';  public function onListen($sender, $args) {    echo $args, ' join the radiostation.<br/>';  }}// 模擬另外一個觀察者類class OtherObserver extends Observer {  protected $name = 'other';  public function onListen($sender, $args) {    echo 'other observer..<br/>';  }}$rs = new RadioStation();// 注入觀察者$rs->addObserver(new RadioStationLogger());$rs->addObserver(new OtherObserver());// 移除觀察者$rs->removeObserver('other');// 可以看到觀察到的信息$rs->addListener('cctv');?>

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91九色国产社区在线观看| 久久免费视频网站| 成人精品一区二区三区电影免费| 97久久久久久| 亚洲一区二区三区成人在线视频精品| 国产精品盗摄久久久| 国产精品免费电影| 亚洲一二三在线| 亚洲国产精久久久久久| 日韩欧美中文字幕在线观看| 亚洲国产精品热久久| 亚洲成人精品av| 欧美日韩精品中文字幕| 这里只有精品在线观看| 国产91九色视频| 在线视频亚洲欧美| 亚洲美腿欧美激情另类| 欧美精品videosex极品1| 亚洲欧美日韩国产中文| 欧美成人精品一区| 性日韩欧美在线视频| 久久天天躁狠狠躁夜夜躁| 欧美日韩激情网| 国产裸体写真av一区二区| 欧美日韩国产一中文字不卡| 国产精品揄拍一区二区| 伊人久久五月天| 欧美一级片久久久久久久| 亚洲激情中文字幕| 91日韩在线播放| 久久九九精品99国产精品| 久久久久久国产精品| 国产精品色视频| 国产欧美日韩精品丝袜高跟鞋| 91精品视频网站| 一区二区在线视频播放| 日韩av免费在线看| 日韩中文视频免费在线观看| 精品日韩美女的视频高清| 欧美电影电视剧在线观看| 亚洲成人久久电影| 久久精品视频中文字幕| 裸体女人亚洲精品一区| 国产99久久精品一区二区| 亚洲少妇激情视频| 粉嫩老牛aⅴ一区二区三区| 日韩av不卡电影| 欧美中文在线免费| 久久精品久久久久久国产 免费| 日韩美女在线观看一区| 精品久久久国产| 国产精品一区久久久| 日韩在线国产精品| 国产精品av电影| 国产日韩在线亚洲字幕中文| 国产精品福利观看| 欧美裸身视频免费观看| 午夜精品久久久久久久白皮肤| 欧美精品久久久久久久| 日韩欧美国产视频| 91麻豆国产精品| 在线观看精品国产视频| 日韩www在线| 亚洲色图激情小说| 亚洲全黄一级网站| 国产精品色午夜在线观看| 国产综合久久久久久| 国产精品嫩草影院一区二区| 51午夜精品视频| 亚洲sss综合天堂久久| 最近2019年手机中文字幕| 日韩欧美成人网| 日韩av网站电影| 亚洲a∨日韩av高清在线观看| 亚洲日韩中文字幕在线播放| 91深夜福利视频| 欧美性猛交丰臀xxxxx网站| 亚洲欧美综合另类中字| 久久99久久99精品免观看粉嫩| 最近中文字幕mv在线一区二区三区四区| 一区二区在线免费视频| 91天堂在线观看| 亚洲性生活视频| 欧美富婆性猛交| 亚洲高清福利视频| www.欧美三级电影.com| 国产日韩欧美视频| 欧美日韩一区二区在线播放| 日韩精品视频在线观看网址| 欧美老少做受xxxx高潮| 日韩一区二区av| 久久成人18免费网站| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品美女免费看| 久久精品成人欧美大片| 欧美精品18videos性欧美| 中文字幕欧美专区| 日韩av网站在线| 欧美激情一区二区三区久久久| 精品国产鲁一鲁一区二区张丽| 国产成人高清激情视频在线观看| 亚洲高清av在线| 亚洲乱码国产乱码精品精天堂| 久久久久久久久中文字幕| 国产精品国产三级国产aⅴ9色| 久久久国产精品一区| 欧美一级电影免费在线观看| 欧洲亚洲妇女av| 91黑丝高跟在线| 国产精品视频一区国模私拍| 亚洲人成电影网站色www| 亚洲国产精品网站| 亚洲aa在线观看| 亚洲欧美www| 亚洲精品av在线| 国产亚洲美女久久| 亚洲美女在线观看| 亚洲欧美一区二区激情| 久久久久久久久久久人体| 日韩欧美在线看| 亚洲国产高清自拍| 久久99国产综合精品女同| 亚洲欧洲一区二区三区久久| 欧美电影免费播放| 亚洲高清免费观看高清完整版| 国产精品福利久久久| 精品综合久久久久久97| 久久精品男人天堂| 国产精品国产福利国产秒拍| 欧美日韩福利视频| 九九热精品视频国产| 亚洲电影在线看| 欧美在线激情网| 国产成人精彩在线视频九色| 欧美日韩亚洲精品内裤| 成人在线视频网站| 欧美另类极品videosbestfree| 亚洲性生活视频在线观看| 日韩国产高清视频在线| 日韩欧美在线网址| 日韩高清中文字幕| 韩国福利视频一区| 精品自拍视频在线观看| 欧美大肥婆大肥bbbbb| 国内伊人久久久久久网站视频| 亚洲xxx自由成熟| 久久视频这里只有精品| 国产精品嫩草影院一区二区| 美女视频久久黄| 亚洲第一福利网站| 青青久久av北条麻妃黑人| 美女久久久久久久| 日韩av大片免费看| 亚洲精品网站在线播放gif| 中文字幕日韩在线观看| www.欧美三级电影.com| 韩日精品中文字幕| 亚洲人在线观看| 国语自产精品视频在线看一大j8| 亚洲91精品在线观看| 日本视频久久久| 成人激情视频在线播放| 欧美精品免费在线| 中文字幕视频一区二区在线有码|