一、设计模式的分类1.单例模式2.工厂模式3.观察者模式4.策略模式5.链式模式1.单例模式的定义:单例模式,顾名思义,就是只有一个实例。单例模式作为一种对象创建模式,保证了某个类只有一个实例,并实例化自己并将这个实例提供给整个系统。特点:第一,一个类只能有一个实例;其次,它必须自己创建这个实例;第三,它必须自己向整个系统提供这个实例。//单例模式classTest{privatestatic$_instance;privatefunction__construct(){echo'我被实例化了';}publicstaticfunctiongetInstance(){if(!isset(self::$_instance)){echo'Instantiate';self::$_instance=新自我;}返回自我::$_实例;}privatefunction__clone(){trigger_error('不允许克隆',E_USER_ERROR);}}$test=Test::getInstance();$test=Test::getInstance();//只会被实例化一次1.php的应用主要是在数据库应用,会有大量应用程序中的数据库操作。在面向对象的开发中,如果使用单例模式,可以避免新的操作大量消耗资源,也可以减少数据库的连接数,不容易出现连接数过多的情况。2、如果系统中需要一个类来全局控制一些配置信息,那么使用单例模式可以很容易地实现。这可以在zendFramework的FrontController部分找到。3.在一个页面请求中,调试起来很方便,因为所有的代码(比如数据库操作类db)都集中在一个类中,我们可以在类中设置hooks,输出日志,避免var_dump和echo到处都是。2.工厂模式①抽象基类:在类中定义一些抽象方法,在子类中实现②从抽象基类继承的子类:在基类中实现抽象方法③工厂类:用于实例化所有相关方法对应的子类//工厂模式/***定义一个抽象类,让子类继承实现*/abstractclassOperation{//抽象方法不能包含函数体abstractpublicfunctiongetValue($num1,$num2);}/***添加类*/类OperationAdd扩展操作{publicfunctiongetValue($num1,$num2){return$num1+$num2;}}/***减法类*/classOperationSubextendsOperation{publicfunctiongetValue($num1,$num2){return$num2-$num1;}}/***乘法类*/classOperationMulextendsOperation{publicfunctiongetValue($num1,$num2){return$num1*$num2;}}/***Divisionclass*/classOperationDivextendsOperation{publicfunctiongetValue($num1,$num2){try{if($num1==0){thrownew\Think\Exception('除数不能为零');}else{返回$num2/$num1;}}catch(\Think\Exception$e){echo"错误信息:".$e->getMessage();}}}/***项目类用于创建对象*根据输入的操作符号工厂可以实例化合适的对象*/classFactory{publicstaticfunctioncreateObj($op){switch($op){case'+':returnnewOperationAdd();休息;案例'_':返回新的OperationSub();休息;case'*':返回新的OperationMul();休息;case'/':返回新的OperationDiv();休息;}}}$test=Factory::createObj('/');$res=$test->getValue(12,14);工厂模式的使用以运输为例:要求你可以自定义运输和生产运输流程1>自定义运输1.定义一个接口,包含送货的方法(开始,运行,停止)2.让飞机,汽车等类实现2>自定义工厂(与上面类似)1.定义一个接口,包含了投放工具的制造方法(start、run、stop)2.编写制造飞机、汽车的工厂类继承并实现该接口3.观察者模式观察者模式是一种行为模式,它定义了一个对象之间一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动得到通知和刷新,完美地将观察者对象与被观察对象区分开来。可以在单独的对象(主体)中维护对主体感兴趣的依赖项(观察者)列表。让所有观察者各自实现一个通用的观察者接口,以消除主体和依赖对象之间的直接依赖。类MyObserver1实现SplObserver{publicfunctionupdate(SplSubject$subject){echo__CLASS__。'-'。$subject->getName();}}classMyObserver2实现SplObserver{publicfunctionupdate(SplSubject$subject){echo__CLASS__.'-'。$subject->getName();}}classMySubject实现SplSubject{private$_observers;私人$_name;公共函数__construct($name){$this->_observers=newSplObjectStorage();$this->_name=$name;}publicfunctionattach(SplObserver$observer){$this->_observers->attach($observer);}publicfunctiondetach(SplObserver$observer){$this->_observers->detach($observer);}publicfunctionnotify(){foreach($this->_observersas$observer){$observer->update($this);}}publicfunctiongetName(){return$this->_name;}}$observer1=新的MyObserver1();$observer2=newMyObserver2();$subject=newMySubject("test");$subject->attach($observer1);$subject->attach($observer2);$subject->notify();4.策略模式在这种模式中,算法是从一个复杂的类中抽取出来的,因此很容易被替换。例如,如果你想改变搜索引擎中页面排名的方法,策略模式是一个不错的选择。考虑搜索引擎的各个部分——遍历页面的部分,对每个页面进行排名的部分,以及根据排名对结果进行排名的部分。在复杂的例子中,这些部分都属于同一个类。通过使用策略模式,您可以将排列部分放到另一个类中,这样您就可以在不影响搜索引擎其余代码的情况下改变页面的排列方式。策略模式非常适用于复杂的数据管理系统或数据处理系统,这两种系统对数据的过滤、搜索或处理方式都要求有很高的灵活性//定义接口interfaceIStrategy{functionfilter($record);}//实现接口方法1classFindAfterStrategyimplementsIStrategy{private$_name;公共函数__construct($name){$this->_name=$name;}publicfunctionfilter($record){returnstrcmp($this->_name,$record)<=0;}}//接口方法1classRandomStrategyimplementsIStrategy{publicfunctionfilter($record){returnrand(0,1)>=0.5;}}//主类classUserList{private$_list=array();公共函数__construct($names){if($names!=null){foreach($namesas$name){$this->_list[]=$name;}}}publicfunctionadd($name){$this->_list[]=$name;}publicfunctionfind($filter){$recs=array();foreach($this->_listas$user){if($filter->f过滤器($user))$recs[]=$user;}返回$recs;}}$ul=newUserList(array("Andy","Jack","Lori","Megan"));$f1=$ul->find(newFindAfterStrategy("J"));print_r($f1);$f2=$ul->find(newRandomStrategy());print_r($f2);php设计模型
