首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP常用的5大设计模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

1.单例模式

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

//单例模式

classSingleton{

?private$runtime;

?privatestatic$instance;

?privatefunction__construct(){

? ? ?$this->runtime=time();

?}

?publicstaticfunctiongetInstance(){

? ? ?if(!(self::$instanceinstanceofself)){

? ? ? ? ?self::$instance=newself();

? ? ?}

? ? ?returnself::$instance;

?}

?publicfunctionrun(){

? ? ?echo$this->runtime,PHP_EOL;

?}

?privatefunction__clone(){

?}

?publicfunction__destruct(){

?}

}

$a=Singleton::getInstance();

$a->run();

$b=Singleton::getInstance();

$b->run();

$c=Singleton::getInstance();

$c->run();

2.工厂模式

工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

//工厂模式

abstractclassOperation{

?abstractpublicfunctiongetValue($num1,$num2);

}

classOperationAddextendsOperation{

?publicfunctiongetValue($num1,$num2){

? ? ?return$num1+$num2;

?}

}

classOperationSubextendsOperation{

?publicfunctiongetValue($num1,$num2){

? ? ?return$num1-$num2;

?}

}

classFactory{

?publicstaticfunctioncreateObj($operate){

? ? ?switch($operate){

? ? ? ? ?case'+':

? ? ? ? ? ? ?returnnewOperationAdd();

? ? ? ? ? ? ?break;

? ? ? ? ?case'-':

? ? ? ? ? ? ?returnnewOperationSub();

? ? ? ? ? ? ?break;

? ? ?}

?}

}

$test=Factory::createObj('+');

echo$test->getValue(2,3);

3.注册模式

//注册模式

//创建单例

classSingle{

?public$hash;

?staticprotected$ins=null;

?finalprotectedfunction__construct(){

? ? ?$this->hash=rand(1,9999);

?}

?staticpublicfunctiongetInstance(){

? ? ?if(self::$insinstanceofself){

? ? ? ? ?returnself::$ins;

? ? ?}

? ? ?self::$ins=newself();

? ? ?returnself::$ins;

?}

}

//工厂模式

classRandFactory{

?publicstaticfunctionfactory(){

? ? ?returnSingle::getInstance();

?}

}

//注册树

classRegister{

?protectedstatic$objects;

?publicstaticfunctionset($alias,$object){

? ? ?self::$objects[$alias]=$object;

?}

?publicstaticfunctionget($alias){

? ? ?returnself::$objects[$alias];

?}

?publicstaticfunction_unset($alias){

? ? ?unset(self::$objects[$alias]);

?}

}

Register::set('rand',RandFactory::factory());

$object=Register::get('rand');

print_r($object);

4.适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

//适配器模式

//目标角色

interfaceTarget{

?publicfunctionsimpleMethod1();

?publicfunctionsimpleMethod2();

}

//源角色classAdaptee{

?publicfunctionsimpleMethod1(){

? ? ?echo'Adapter simpleMethod1'."";

?}

}

//类适配器角色

classAdapterimplementsTarget{

?private$adaptee;

?function__construct(Adaptee$adaptee){

? ? ?$this->adaptee=$adaptee;

?}

?//委派调用Adaptee的sampleMethod1方法

?publicfunctionsimpleMethod1(){

? ? ?echo$this->adaptee->simpleMethod1();

?}

?publicfunctionsimpleMethod2(){

? ? ?echo'Adapter simpleMethod2'."";

?}

}

//客户端

classClient{

?publicstaticfunctionmain(){

? ? ?$adaptee=newAdaptee();

? ? ?$adapter=newAdapter($adaptee);

? ? ?$adapter->simpleMethod1();

? ? ?$adapter->simpleMethod2();

?}

}

Client::main();

5.观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

//观察者模式

// 主题接口

interfaceSubject{

?publicfunctionregister(Observer$observer);

?publicfunctionnotify();

}

// 观察者接口

interfaceObserver{

?publicfunctionwatch();

}

// 主题

classActionimplementsSubject{

?public$_observers=array();

?publicfunctionregister(Observer$observer){

? ? ?$this->_observers[]=$observer;

?}

?publicfunctionnotify(){

? ? ?foreach($this->_observersas$observer){

? ? ? ? ?$observer->watch();

? ? ?}

?}

}

// 观察者

classCatimplementsObserver{

?publicfunctionwatch(){

? ? ?echo"Cat watches TV";

?}

}

classDogimplementsObserver{

?publicfunctionwatch(){

? ? ?echo"Dog watches TV";

?}

}

classPeopleimplementsObserver{

?publicfunctionwatch(){

? ? ?echo"People watches TV";

?}

}

// 应用实例

$action=newAction();

$action->register(newCat());

$action->register(newPeople());

$action->register(newDog());

$action->notify();

看完本文有收获?点赞、分享是最大的支持!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200902A02L3I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com