PHP 设计模式

单例模式

      单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式的要点有三个:

  1. 一是某个类只能有一个实例;
  2. 二是它必须自行创建这个实例;
  3. 三是它必须自行向整个系统提供这个实例。
为什么要使用PHP单例模式
  1. 1. php的应用主要在于数据库应用, 一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现 too many connections情况。
  2. 2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。
  3. 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;
View Code

简单工厂模式

  • ①抽象基类:类中定义抽象一些方法,用以在子类中实现
  • ②继承自抽象基类的子类:实现基类中的抽象方法
  • ③工厂类:用以实例化所有相对应的子类

 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 }
View Code

通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’等,以还可以避免加载没有必要的代码。

现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂

 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;
View Code

观察者模式

      观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依 赖于它的对象都得到通知并自动刷新。它完美的将观察者对象和被观察者对象分离。可以在独立的对象(主体)中维护一个对主体感兴趣的依赖项(观察器)列表。 让所有观察器各自实现公共的 Observer 接口,以取消主体和依赖性对象之间的直接依赖关系。(反正我看不明白

 

posted @ 2015-03-16 18:04  JesseLucky  阅读(67)  评论(0)    收藏  举报