一看就懂系列之 php设计模式(一) - Go语言中文社区

一看就懂系列之 php设计模式(一)


友情链接:
一看就懂系列之 php设计模式(零)
一看就懂系列之 php设计模式(一)

前言

一提到设计模式,很多人都是敬而远之,一方面由于设计模式有一点忽悠太理论的感觉,另一方面也会觉得设计模式有点难懂不知道该在什么场景下使用。一看就懂系列之php设计模式,主要解决两个问题:

1.用最通俗的话来讲讲设计模式是什么。
2.设计模式到底可以在哪些地方可以用上,顺利装逼成功。

PHP设计模式

单例模式

我的理解

1.一个类一个实例;
2.这个实例必须自行创建;
3.向整个系统提供这个实例

使用姿势

1.数据库应用(缓存):一个系统中会有大量的数据库操作,面对对象开发时候,如果每个地方都去new一个实例,会消耗大量资源并且连接数据库也需要成本的,此时就需要使用单例模式,全局一个实例,减少数据库连接就不容易出现too many connections情况。

2.全局配置信息:每个系统都会有全局的配置信息,会在多处调用,这时候可以定义一个全局配置类,使用单例模式 来实例化一个类进行读取与设置。

伪代码实现

/**
 * 设计模式之单例模式
 * $_instance必须声明为静态的私有变量
 * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
 * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
 * ::操作符只能访问静态变量和静态函数
 * new对象都会消耗内存
 * 使用场景:最常用的地方是数据库连接。
 * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
 */
class man
{
    //保存例实例在此属性中
    private static $_instance;

    //构造函数声明为private,防止直接创建对象
    private function __construct()
    {
        echo '我被实例化了!';
    }

    //单例方法
    public static function get_instance()
    {
        var_dump(isset(self::$_instance));

        if(!isset(self::$_instance))
        {
            self::$_instance=new self();
        }
        return self::$_instance;
    }

    //阻止用户复制对象实例
    private function __clone()
    {
        trigger_error('Clone is not allow' ,E_USER_ERROR);
    }

    function test()
    {
        echo("test");
    }
}

// 这个写法会出错,因为构造方法被声明为private
//$test = new man;

// 下面将得到Example类的单例对象
$test = man::get_instance();
$test = man::get_instance();
$test->test();

// 复制对象将导致一个E_USER_ERROR.
//$test_clone = clone $test;

工厂模式

我的理解

1.抽象基类,在类中抽象一些方法,在不同的子类中进行实现。
2.继承抽象积累的子类,实现基类中的抽象方法
3.工厂类,实例化所有子类,以供调用。

使用姿势

1.当一个模块有许多相似的功能的时候,可以使用工厂模式,以避免代码耦合。

伪代码实现

   /**
     * 
     * 定义个抽象的类,让子类去继承实现它
     *
     */
     abstract class Operation{
         //抽象方法不能包含函数体
         abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
     }



     /**
      * 加法类
      */
     class OperationAdd extends Operation {
         public function getValue($num1,$num2){
             return $num1+$num2;
         }
     }
     /**
      * 减法类
      */
     class OperationSub extends Operation {
         public function getValue($num1,$num2){
             return $num1-$num2;
         }
     }
     /**
      * 乘法类
      */
     class OperationMul extends Operation {
         public function getValue($num1,$num2){
             return $num1*$num2;
         }
     }
     /**
      * 除法类
      */
     class OperationDiv extends Operation {
         public function getValue($num1,$num2){
             try {
                 if ($num2==0){
                     throw new Exception("除数不能为0");
                 }else {
                     return $num1/$num2;
                 }
             }catch (Exception $e){
                 echo "错误信息:".$e->getMessage();
             }
         }
     }

定义了一个抽象类,许多子类都实现了抽象的方法,实现了相应各自的功能,极大程度上降低藕合度,十分便于维护和扩展,此时需要再来一个工厂方法 就组成工厂模式 了,工厂方法就是实例化各子类以便调用。

   /**
     * 工程类,主要用来创建对象
     * 功能:根据输入的运算符号,工厂就能实例化出合适的对象
     *
     */
    class Factory{
        public static function createObj($operate){
            switch ($operate){
                case '+':
                    return new OperationAdd();
                    break;
                case '-':
                    return new OperationSub();
                    break;
                case '*':
                    return new OperationSub();
                    break;
                case '/':
                    return new OperationDiv();
                    break;
            }
        }
    }
    $test=Factory::createObj('/');
    $result=$test->getValue(23,0);
    echo $result;

这里写图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u011957758/article/details/51010585
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-13 20:28:35
  • 阅读 ( 1807 )
  • 分类:设计模式

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢