1、策略模式
策略模式的一个典型应用是处理程序算法与其他算法之间的互换。策略模式的实现方法通常是声明一个抽象的拥有一个算法方法的基类来实现,而且通过继承这个基类的具体的类来实现。在代码中的一些关键点,设计模式将决定哪个具体的策略是相关的,然后实例化冰使用任何相关的类。
例子:
<?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>
2、单件模式
如果需要一个对象来处理应用的一些集中的操作,例如一个日志记录对象。这个覆盖整个应用范围的对象实例的存在,让整个应用的代码都可以访问它。通常,这是通过实现一个静态类方法getInstance()实现的,这个方法只返回该类的唯一实例。在你第一次调用这个方法的时候,它创建一个实例,把它存在一个私有的静态的变量中,并且给你返回实例。下一次,它将仅仅返回那个已经创建的实例的句柄。
下面是一个例子:
<?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()是唯一可以访问单件类实例的方法。
3、工厂模式
在一些阶段,必须创建基类的子类的一个具体实例。通常是工厂模式实现的。一个工厂类拥有一个静态方法,用来接收一些输入,并根据输入决定应该创建那个类的实例(通常是一个子类)。