• PHP面向对象设计模式和设计原则


    一、设计模式

      1.单例模式

        目的:让一个类只能生成一个对象

        步骤:    ①将构造函数变成私有的 

            ②在类里面做一个静态成员函数造对象

            ③在方法里加限制条件

        //单例模式
        class Ren{                //定义人类
            public static $r;    //设定静态成员变量,为了可以带入静态成员函数中
            public $name;        //普通成员变量,用于测试是否只实例化了一个对象
            private function __construct(){        //私有化构造函数,阻止实例化对象
                    
            }
            public static function duixiang(){    //创建一个静态成员函数,用于访问构造函数以实例化对象
                if(empty(self::$r)){            //设定限制条件
                    self::$r = new Ren();
                }
                return self::$r;                //返回$r中的唯一的实例化对象
            }
        }
        
        $r = Ren::duixiang();    //访问静态函数实例化对象
        $r->name = "张三";        //给对象的$name赋值"张三"
        $r1 = Ren::duixiang();    //测试是否只有一个对象
        var_dump($r1);

        只有一个对象

        

      

      工厂模式

        目的:做一个专门造对象的工厂

          如果一个父类的子类量比较庞大,子类名命名方式不一致,可以用这种模式以代号方式造对象

        //工厂模式
        class Jisuan{        //定义一个计算父类
            public $a;        //两个普通成员变量
            public $b;        
            public function Js(){    //定义一个计算的普通成员函数
                echo"计算结果为";    
            }
            public function __construct($a,$b){    //构造函数,用于实例化对象时设定初始的$a和$b的值
                $this->a = $a;
                $this->b = $b;    
            }    
        }
        class Jia extends Jisuan{    //子类加法
            public function Js(){    //子类重写的计算函数
                parent::Js();
                return($this->a+$this->b);    
            }    
        }
        class Jian extends Jisuan{    //子类减法
            public function Js(){    //子类重写的计算函数    
                parent::Js();
                return($this->a-$this->b);    
            }    
        }
        class Cheng extends Jisuan{    //子类乘法
            public function Js(){    //子类重写的计算函数
                parent::Js();
                return($this->a*$this->b);    
            }    
        }
        class Chu extends Jisuan{    //子类除法
            public function Js(){    //子类重写的计算函数
                parent::Js();
                return($this->a/$this->b);    
            }    
        }
        class Quyu extends Jisuan{    //子类取余
            public function Js(){    //子类重写的计算函数
                parent::Js();
                return($this->a%$this->b);    
            }    
        }
        
        class GongChang{        //定义一个工厂类,用于生产实例化对象
            public static function duixiang($a,$b,$ysf){    //设置静态成员函数并传入参数,以运算符号代替子类的名称
                switch($ysf){        //分支较多,用switch case 语句设计不同运算符号所对应不同的子类并实例化对象
                    case "+";
                        return new Jia($a,$b);
                        break;    
                
                    case "-";
                        return new Jian($a,$b);
                        break;    
                
                    case "*";
                        return new Cheng($a,$b);
                        break;    
                
                    case "/";
                        return new Chu($a,$b);
                        break;    
                
                    case "%";
                        return new Quyu($a,$b);
                        break;    
                }
            }    
        }
        $j = GongChang::duixiang(3,2,"%");    //测试
        echo $j->Js();    //输出

       输出结果   

    二、设计六大原则

      1.开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。

      2.里氏代还原则,子类必须能够替换基类,否则不应当设计为其子类。

      3.依赖倒换原则,设计要依赖于抽象而不是具体化,换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体。

      4.接口隔离原则,将大的接口打散成多个小接口

      5.单一职责:一个类的功能尽量单一,降低耦合

      6.迪米特法则(最少知识原则),一个对象应当对其他对象有尽可能少的了解,不和陌生人说话

  • 相关阅读:
    odoo redis ormcache
    docker 查看所有容器内存及cup使用情况
    linux sudo某个用户不能用
    odoo 报表打印数据改了,但报表显示旧值 payments check number
    odoo 实现三方物流系统库存功能
    学到一个清理电脑C盘的方式记录一下
    定位页面上的toast提示
    testNG打开新页面后定位元素xpath正确但是提示定位不到
    selenium中模拟鼠标点击页面空白处操作方法
    获取时间戳(毫秒级和秒级)
  • 原文地址:https://www.cnblogs.com/zxbs12345/p/8267447.html
Copyright © 2020-2023  润新知