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

posted @ 2018-01-11 11:19  黑山大胖子  阅读(210)  评论(0编辑  收藏  举报