一、策略模式php
策略模式的一個典型應用是處理程序算法與其餘算法之間的互換。策略模式的實現方法一般是聲明一個抽象的擁有一個算法方法的基類來實現,並且經過繼承這個基類的具體的類來實現。在代碼中的一些關鍵點,設計模式將決定哪一個具體的策略是相關的,而後實例化冰使用任何相關的類。算法
例子:設計模式
<?php abstract class FileNamingStrategy{ abstract function createLinkName($filename); } class ZipFileNamingStrategy extends FileNamingStrategy{ function createLinkName($filename){ return "http://downloads.foo.bar/$filename.zip"; } } class TarGzFileNamingStrtegy extends FileNamingStrategy{ function createLinkName($filename){ return "http://downloads.foo.bar/$filename.tar.gz"; } } if(strstr($_SERVER["HTTP_USER_AGENT"],"Win")){ $fileNamingObj=new ZipFileNamingStrategy(); }else{ $fileNamingObj=new TarGzFileNamingStrtegy(); } $calc_filename=$fileNamingObj->createLinkName("Calc101"); $stat_filename=$fileNamingObj->createLinkName("Stat2000"); print <<<EOF <h1>The following is a list of great downloads</h1> <br> <a href="$calc_filename">A great calculator</a><br> <a href="$stat_filename">The best statistics application</a><br> <br> EOF; ?>
瀏覽器獲得的網頁源碼:瀏覽器
<h1>The following is a list of great downloads</h1> <br> <a href="http://downloads.foo.bar/Calc101.zip">A great calculator</a><br> <a href="http://downloads.foo.bar/Stat2000.zip">The best statistics application</a><br> <br>
二、單件模式app
若是須要一個對象來處理應用的一些集中的操做,例如一個日誌記錄對象。這個覆蓋整個應用範圍的對象實例的存在,讓整個應用的代碼均可以訪問它。一般,這是經過實現一個靜態類方法getInstance()實現的,這個方法只返回該類的惟一實例。在你第一次調用這個方法的時候,它建立一個實例,把它存在一個私有的靜態的變量中,而且給你返回實例。下一次,它將僅僅返回那個已經建立的實例的句柄。函數
下面是一個例子:spa
<?php class Logger{ static function getInstance(){ if(self::$instance == NULL){ self::$instance = new Logger(); } return self::$instance; } private function __construct(){} private function __clone(){} function Log($str){ //注意日誌 } static private $instance=NULL; } Logger::getInstance->Log("Checkpoint"); ?>
構造函數和克隆方法都被定義爲private是爲了防止開發者用new或者clone運算符錯誤地建立第二個Logger實例,所以,getInstance()是惟一能夠訪問單件類實例的方法。設計
三、工廠模式日誌
在一些階段,必須建立基類的子類的一個具體實例。一般是工廠模式實現的。一個工廠類擁有一個靜態方法,用來接收一些輸入,並根據輸入決定應該建立那個類的實例(一般是一個子類)。code