深入解析PHP设计模式:注册树模式、工厂模式与单例模式的详细学习指南
PHP基本设计模式全集(注册树模式、工厂模式、单列模式)、单列设计模式

废话不多说,我先给大家介绍注册树模式,然后介绍工厂模式,最后介绍单列模式。这篇文章写的很详细,大家一起学习一下。
php注册树模式
什么是注册树模式?
注册树模式当然也称为注册模式、注册商模式。我之所以在这里对它的名字自命不凡,是因为我觉得名字注册树更容易让人理解。和前两篇文章一样,我们的文章仍然以名字开头。注册树模式是一种将对象实例注册到全局对象树并在需要时从对象树中选取的模式设计方法。这让我想起小时候买的冰糖葫芦。卖糖葫芦的人会把糖葫芦粘在一根大杆子上,人们买的时候就把它取下来。不同的是,在注册树模式下,采摘后还会有一些,而且可以采摘多次,但冰糖葫芦采摘一次后就没有了。 。 。
为什么要使用注册树模式?
单例模式解决的是如何在整个项目中创建唯一的对象实例的问题,工厂模式解决的是如何不使用new来创建实例对象的问题。那么注册树模式想要解决什么问题呢?在考虑这个问题之前,我们还需要考虑前两种模型目前面临的局限性。首先,单例模式创建唯一对象的过程本身有一个判断,即该对象是否存在。如果存在则返回该对象;如果不存在,则创建并返回该对象。每次创建实例对象时,都要经过这么一层判断。工厂模式更多地考虑了延长维护的问题。一般来说,单例模式和工厂模式可以产生比较合理的对象。如何方便的调用这些对象呢?而且,这样创建的对象在项目中就像是分散的士兵,不方便整体管理和安排。因此,注册树模型应运而生。无论你是通过单例模式、工厂模式还是两者的组合生成对象,它们都会被“插入”到注册树中。当我使用一个对象时,我只是直接从注册树中获取它。这与使用全局变量一样方便实用。并且注册树模式也为其他模式提供了一个非常好的思路。
如何实现注册树?
通过上面的描述,我们似乎很容易找到解决办法。当然,首先我们需要一个类作为注册树。所有对象都被“插入”到注册树中。该注册树应由静态变量提供服务。而这个注册树应该是一个二维数组。该类应该有一个用于插入对象实例的方法(set()),相应地应该有一个用于撤消对象实例的方法(_unset())。当然,最重要的是要有一个读取对象的方法(get())。有了这些,我们就可以愉快的完成注册树模式了~~~
让我们对这三种模式进行一个小的组合。简单地创建一个实例对象远没有那么复杂,但是当应用于大型项目时,其便利性是不言而喻的。
hash=rand(1,9999);
}
static public function getInstance(){
if (self::$ins instanceof self) {
return self::$ins;
}
self::$ins=new self();
return self::$ins;
}
}
//工厂模式
class RandFactory{
public static function factory(){
return Single::getInstance();
}
}
//注册树
class Register{
protected static $objects;
public static function set($alias,$object){
self::$objects[$alias]=$object;
}
public static function get($alias){
return self::$objects[$alias];
}
public static function _unset($alias){
unset(self::$objects[$alias]);
}
}
Register::set('rand',RandFactory::factory());
$object=Register::get('rand');
print_r($object);
登录后复制
至此,三种模型设计就介绍完毕了。各种图案设计本身会相辅相成。以后在引入其他模式时,或多或少都会用到一种或多种其他设计模式。
如果你看不懂某个模型也没关系。相信随着编程的深入,一定会有惊喜感和启迪感。希望你能和我一起进步。
PHP工厂模式
那么什么是工厂模式呢?
从名字来看,似乎没有任何线索。工厂模式,与生产有关吗?还是和生产工艺有关?难道和厂领导有关?跟领导秘书有关系吗?秘书……好吧,我们不要走得太近。所谓工厂模式,其实是和生产相关的。生产什么?生成的是一个实例对象。使用什么设备来生产?通过工厂类生产。如何生产呢?工厂类调用它自己的静态方法来生成对象实例。
工厂模式有一个关键的构造,它是一个根据一般原则命名为Factory的静态方法。然而,这只是一个原则。虽然工厂方法可以任意命名,但是这个静态方法也可以接受任何数据的参数,并且必须返回一个对象。
为什么要使用工厂模式?
很多从未接触过工厂模式的人不禁会问,为什么我要花这么大的精力去构建工厂类来创建对象呢?我们可以考虑这样一个简单的问题,而不是应用易于维护和可扩展性之类的东西。如果在项目中,我们通过类来创建对象。当快完成或者已经完成,需要扩展功能时,发现原来的类名不太合适或者类需要添加构造函数参数来实现功能扩展。天啊!我通过这个类创建了很多对象实例。我还需要一一改变吗?现在我们才感受到“高内聚、低耦合”的广度和深度。没问题,工厂方法可以解决这个问题。
再想一想,我要连接数据库,PHP中有好几种方法,mysql扩展,mysqli扩展,PDO扩展。我只是想要一个用于将来操作的对象。我想要哪一个取决于具体情况。既然都是连接数据库,那么就应该有相同的功能,建立连接、查询、断开连接……(接口的重要性由此可见)。总而言之,这些方法应该是“对外统一、统一”。如何实现这一目标?使用工厂模式。
工厂模式如何实现?
相对于单例模式,上面我们已经提供了足够的信息,工厂类,以及工厂类中的静态方法。只需new静态方法中需要创建的对象实例即可。当然,对于上面的第二个问题,我们可以简单的根据工厂类的静态方法的参数来进行判断。无论使用 if..else.. 还是 switch..case..,如果能够快速高效地完成确定创建哪个类的工作,那就太好了。最后,一定要记住工厂类静态方法返回一个对象。不是两个,更不用说三个了。
基本工厂类:
//要创建对象实例的类
class MyObject{
}
//工厂类
class MyFactory{
public static function factory(){
return new MyObject():
}
}
$instance=MyFactory::factory();
登录后复制
稍微复杂一点的工厂模式:
go();
登录后复制
当你需要工厂静态方法为factory()时,不要愚蠢地将工厂类命名为Factory。为什么?不要忘记同名的构造函数~
最后说一下我的感受。许多新手比其他人更有野心。他们刚刚学习了 if..else..、session 和 cookie,并且即将学习一些高级的东西。与人交谈时,经常会谈到可扩展性、可维护性等。至于例子,你会一时无言以对。有时候感觉无论是写代码还是和别人一起学习,我总是处于“在人群中寻找别人”的阶段。真正用功学习后,蓦然回首,“那个人就在灯火阑珊处”,惊呼:“原来这个人是……简直就是***。”
作者不敢承认我懂得设计模式。我也是初学者不到一年。我只是想分享我的博客来记录我的学习过程。我想了解更多。如果能帮助到别人就更好了~~~
php单列模式
什么是图案设计?
初学者一开始会被这个崇高的名字吓到。对于具有丰富编程经验的老手来说,模式设计无处不在。许多联系框架是基于各种模式设计的。简单来说,在写代码的过程中,一开始经常接触到的是面向过程的、简单的、基础的编程。这时候我们往往追求的是代码能实现某个功能就万事大吉了。不管代码有多么冗余,是否可重用,或者效率如何,只要能实现功能就行。然而,真正应用到实践中并被大家采用的,是高效、可复用、易于团队开发的代码。基于这些因素,你不能像练习一样,随便命名函数、放置脚本。模式设计建议是为人们提供一种组织代码的思路,实现代码的可重用,让代码更容易被别人理解,保证代码的可靠性。
在所有的模式设计中,有三种基本的设计模式,单例模式、工厂模式、注册树模式。其他模式通常基于这些模式。以下是单例模式。
什么是单例模式?
从这个名字我们很容易理解,单例模式是指整个应用程序中只有一个对象实例的设计模式。
为什么使用单例模式?
PHP 经常与数据库打交道。如果应用程序中频繁建立连接对象并进行新的操作,将会消耗大量的系统内存资源。这不是我们希望看到的。而且,在团队合作项目中,单例模式可以有效防止不同程序员new自己的对象,造成人为的系统消耗。
如何创建单例模式?
当看到这个问题时,我相信优秀的程序员很可能会根据需求去尝试创建单例模式,而不是等待前人的经验。与其他博主告诉你什么样的模式是单例模式不同,我更喜欢和有面向对象编程基础经验的你一起思考如何自己构建单例模式。
我们先从标题开始吧。单例模式是一种只有一个对象实例的设计模式。这是非常痛苦的。我们平时创建的类要么可以创建很多对象,要么不能创建对象(抽象类)。创建对象需要一个类,并且不能是抽象类。这个类是为了防止别人多次创建函数。我们很自然地考虑从构造函数开始。然而,每次new操作都会调用构造函数,这意味着对象实例将被创建多次。这违背了我们最初的设计意图。一定要在这里将构造函数声明为 private 或 protected 来解决这个问题。
如果构造函数被声明为private或者protected,就注定无法通过new方法创建实例对象。而且我们发现经过这一步处理之后,解决问题的前景就变得清晰起来了?为什么?由于不能通过new方法创建对象实例,所以我们只能通过类内部的方法创建对象实例。这时候我们就面临一个有趣的先有鸡还是先有蛋的问题。我们经常在创建对象后调用该对象的方法。这时候我们就需要调用类中的方法来创建对象。解决方法无论对象是否创建都可以调用的方法无疑是使用关键字--static。
在类中创建静态方法有什么作用?回到主题:确保只创建一个实例对象。如何保证只有一个?这个很简单,判断一下就可以了。如果存在则直接返回。如果不存在,请自行创建一个。当然,这个实例对象是类的静态属性。至此,单例模式所需要的功能就实现了。真的完成了吗?还没有~如果一个类继承了这个类,将构造函数声明为public岂不是一件坏事?那么就需要在构造方法之前添加final关键字。
最后贴上单例模式代码,代码解释如上~~
hash=rand(1,9999);
}
static public function getInstance(){
if (self::$ins instanceof self) {
return self::$ins;
}
self::$ins=new self();
return self::$ins;
}
}
登录后复制
单例模式本身并不复杂,但需要深入理解。很多初学者还感叹:妈的,构造函数并不总是public的~妈的,不用new也能创建对象~其实作者想说的是,无论构造函数声明为public、private还是protected,对象最终创建时每次都会被调用。 New 始终用于创建对象实例。单例模式也是用new来创建对象,只不过换了个地方,从类外到类内。
最后对开发出各种精美图案设计的程序员表示敬佩~~