PHP經常使用的5大設計模式

設計模式(Design pattern)表明了最佳的實踐,一般被有經驗的面向對象的軟件開發人員所採用。設計模式是軟件開發人員在軟件開發過程當中面臨的通常問題的解決方案。這些解決方案是衆多軟件開發人員通過至關長的一段時間的試驗和錯誤總結出來的。php









1.單例模式設計模式

單例模式(Singleton Pattern)是最簡單的設計模式之一。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。微信

這種模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。app

<?phpflex

//單例模式this

class Singleton {
   
private $runtime;
   
private static $instance;

   
private function __construct() {
       
$this->runtime = time();
   
}

   
public static function getInstance() {
       
if(!(self::$instance instanceof self)) {
           
self::$instance = new self();
       
}
       
return self::$instance;
   
}

   
public function run() {
       
echo $this->runtime,PHP_EOL;
   
}

   
private function __clone() {
   
}

   
public function __destruct() {
   
}spa

}.net

$a = Singleton::getInstance();設計

$a->run();code

$b = Singleton::getInstance();

$b->run();

$c = Singleton::getInstance();

$c->run();


2.工廠模式

工廠模式(Factory Pattern)是最經常使用的設計模式之一。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。

在工廠模式中,咱們在建立對象時不會對客戶端暴露建立邏輯,而且是經過使用一個共同的接口來指向新建立的對象。

<?php

//工廠模式

abstract class Operation {
   
abstract public function getValue($num1, $num2);

}


class OperationAdd extends Operation {
   
public function getValue($num1, $num2) {
       
return $num1 + $num2;
   
}

}


class OperationSub extends Operation {
   
public function getValue($num1, $num2) {
       
return $num1 - $num2;
   
}

}


class Factory {
   
public static function createObj($operate) {
       
switch ($operate) {
           
case '+':
               
return new OperationAdd();
               
break;

           
case '-':
               
return new OperationSub();
               
break;
       
}
   
}

}


$test = Factory::createObj('+');


echo $test->getValue(2, 3);


3.註冊模式

<?php

//註冊模式

//建立單例

class Single{
   
public $hash;
   
static protected $ins=null;


   
final protected function __construct(){
       
$this->hash=rand(1,9999);
   
}

   
static public function getInstance(){
       
if (self::$ins instanceof self) {
           
return self::$ins;
       
}
       
self::$ins=new self();
       
return self::$ins;
   
}

}


//工廠模式

class RandFactory{
   
public static function factory(){
       
return Single::getInstance();
   
}

}


//註冊樹

class Register{
   
protected static $objects;
   
public static function set($alias,$object){
       
self::$objects[$alias]=$object;
   
}
   
public static function get($alias){
       
return self::$objects[$alias];
   
}
   
public static function _unset($alias){
       
unset(self::$objects[$alias]);
   
}

}


Register::set('rand',RandFactory::factory());

$object=Register::get('rand');

print_r($object);


4.適配器模式

適配器模式(Adapter Pattern)是做爲兩個不兼容的接口之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。

這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。舉個真實的例子,讀卡器是做爲內存卡和筆記本之間的適配器。您將內存卡插入讀卡器,再將讀卡器插入筆記本,這樣就能夠經過筆記原本讀取內存卡。

<?php

//適配器模式

//目標角色  

interface Target {  
   
public function simpleMethod1();
   
public function simpleMethod2();

}


//源角色class Adaptee {
   
public function simpleMethod1(){
       
echo 'Adapter simpleMethod1'."<br>";
   
}

}


//類適配器角色

class Adapter implements Target {
   
private $adaptee;

   
function __construct(Adaptee $adaptee) {
       
$this->adaptee = $adaptee;
   
}

   
//委派調用Adaptee的sampleMethod1方法
   
public function simpleMethod1(){
       
echo $this->adaptee->simpleMethod1();
   
}

   
public function simpleMethod2(){
       
echo 'Adapter simpleMethod2'."<br>";
   
}  

}


//客戶端

class Client {
   
public static function main() {
       
$adaptee = new Adaptee();
       
$adapter = new Adapter($adaptee);
       
$adapter->simpleMethod1();
       
$adapter->simpleMethod2();
   
}

}

Client::main();


5.觀察者模式

當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。好比,當一個對象被修改時,則會自動通知依賴它的對象。觀察者模式屬於行爲型模式。

<?php

//觀察者模式

// 主題接口

interface Subject{
   
public function register(Observer $observer);
   
public function notify();

}


// 觀察者接口

interface Observer{
   
public function watch();

}


// 主題

class Action implements Subject{
   
public $_observers=array();

   
public function register(Observer $observer){
       
$this->_observers[]=$observer;
   
}

   
public function notify(){
       
foreach ($this->_observers as $observer) {
           
$observer->watch();
       
}

   
}
}


// 觀察者

class Cat implements Observer{
   
public function watch(){
       
echo "Cat watches TV<hr/>";
   
}

}


class Dog implements Observer{
   
public function watch(){
       
echo "Dog watches TV<hr/>";
   
}

}


class People implements Observer{
   
public function watch(){
       
echo "People watches TV<hr/>";
   
}

}


// 應用實例

$action=new Action();

$action->register(new Cat());

$action->register(new People());

$action->register(new Dog());

$action->notify();



  
         
         
          
          
                   
          
  
         
      
             
             
              
              
                       
              
      
             

看完本文有收穫?點贊、分享是最大的支持!



本文分享自微信公衆號 - Laravel技術社區(Laravel360)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索