一、策略模式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