PHP 设计模式
单例模式
单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式的要点有三个:
- 一是某个类只能有一个实例;
- 二是它必须自行创建这个实例;
- 三是它必须自行向整个系统提供这个实例。
为什么要使用PHP单例模式
- 1. php的应用主要在于数据库应用, 一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现 too many connections情况。
- 2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。
- 3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump,
例子:
1 /** 2 * 设计模式之单例模式 3 * $_instance必须声明为静态的私有变量 4 * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义 5 * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用 6 * ::操作符只能访问静态变量和静态函数 7 * new对象都会消耗内存 8 * 使用场景:最常用的地方是数据库连接。 9 * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。 10 */ 11 class man 12 { 13 //保存例实例在此属性中 14 private static $_instance; 15 16 // 构造函数声明为private,防止直接创建对象 17 private function __construct() 18 { 19 echo '我被实例化了!'; 20 } 21 22 public static function get_instance() 23 { 24 var_dump(isset(self::$_instance)) 25 26 if(!isset(self::$_instance)) 27 { 28 self::$_instance=new self(); 29 } 30 return self::$_instance; 31 } 32 33 //阻止用户复制对象实例 34 private function __clone() 35 { 36 trigger_error('Clone is not allow',E_USER_ERROR); 37 } 38 39 function test() 40 { 41 echo("test"); 42 } 43 } 44 45 //这个写法会出错,因为构造方法被声明为private 46 //$test = new man; 47 48 //下面将得到Example类的单例对象 49 $test = man::get_instance(); 50 $test = man::get_instance(); 51 52 $test->test(); 53 54 //复制对象将导致一个E_USER_ERROR 55 //$test_clone = clone $test;
简单工厂模式
- ①抽象基类:类中定义抽象一些方法,用以在子类中实现
- ②继承自抽象基类的子类:实现基类中的抽象方法
- ③工厂类:用以实例化所有相对应的子类

1 /** 2 * 3 * 定义个抽象的类,让子类去继承实现它 4 * 5 */ 6 7 abstract class Operation{ 8 //抽象方法不能包含函数体 9 abstract public function getValue($num1,$num2); 10 } 11 12 13 /** 14 * 加法类 15 */ 16 17 class OperationAdd extends Operation 18 { 19 public function getValue($num1,$num2) 20 { 21 return $num1+$num2; 22 } 23 } 24 25 26 /** 27 * 减法类 28 */ 29 class OperationSub extends Operation 30 { 31 public funciton getValue($num1,$num2) 32 { 33 return $num1 + $num2; 34 } 35 } 36 37 38 /** 39 *乘法类 40 */ 41 class OperationMul extends Operation 42 { 43 public function getValue($num1,$num2) 44 return $num1*$num2; 45 } 46 47 48 /** 49 * 除法 50 */ 51 class OperationDiv extends Operation 52 { 53 public function getValue($num1,$num2) 54 { 55 try { 56 if ($num2==0) 57 { 58 throw new Exception("除数不能为0"); 59 } 60 else 61 { 62 return $num1/$num2; 63 } 64 }catch(Exception $e) 65 { 66 echo "错误信息: ".$e->getMessage(); 67 } 68 } 69 }
通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’等,以还可以避免加载没有必要的代码。
现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂
1 /** 2 * 工程类,主要用来创建对象 3 * 功能:根据输入的运算符号,工厂就能实例化出合适的对象 4 * 5 */ 6 class Factory{ 7 public static function createObj($operate) 8 switch ($operate) 9 { 10 case '+': 11 return new OperationAdd(); 12 break; 13 case '-': 14 return new OperationSub(); 15 break; 16 case '*': 17 return new OperationMul(); 18 break; 19 case '/': 20 return new OperationDiv(); 21 break; 22 } 23 } 24 $test=Factory::createObj('/'); 25 $result=$test->getValue(23,0); 26 echo $result;
观察者模式
观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依 赖于它的对象都得到通知并自动刷新。它完美的将观察者对象和被观察者对象分离。可以在独立的对象(主体)中维护一个对主体感兴趣的依赖项(观察器)列表。 让所有观察器各自实现公共的 Observer 接口,以取消主体和依赖性对象之间的直接依赖关系。(反正我看不明白

浙公网安备 33010602011771号