これ以上ナンセンスではありません。最初に登録ツリーモードを紹介し、次にファクトリモードを紹介します。最後にシングルカラムモードについて紹介します。この記事に詳しく書かれていますので、一緒に勉強しましょう。
php登録ツリーモード
登録ツリーモードとは何ですか?
登録ツリーモードは、もちろん登録モード、レジストラモードとも呼ばれます。ここであえて名前を付けたのは、名前登録ツリーの方が分かりやすいと思うからです。前の 2 つの記事と同様に、この記事も名前から始まります。登録ツリー パターンは、オブジェクト インスタンスをグローバル オブジェクト ツリーに登録し、必要に応じてオブジェクト ツリーから選択するパターン設計方法です。これを聞くと、私が子供の頃に砂糖漬けのサンザを棒に付けて買ったのを思い出します。砂糖漬けのサンザの売り手は砂糖漬けのサンザを大きな棒に刺し、人々はそれを買うときにそれを外していました。違いは、登録ツリー モードでは、摘んだ後も残り、何度でも摘むことができますが、サンザシの砂糖漬けは一度摘むとなくなってしまうことです。 。 。
なぜ登録ツリーモードを使用するのですか?
シングルトンパターンはプロジェクト全体で一意のオブジェクトインスタンスをどうやって作るかという問題を解決し、ファクトリパターンはnewを使わずにインスタンスオブジェクトをどうやって作るかという問題を解決します。 それでは、登録ツリー モードはどのような問題を解決したいのでしょうか? この問題を検討する前に、最初の 2 つのモデルが現在直面している制限を考慮する必要があります。まず、シングルトンモードで独自のオブジェクトを作成するプロセス自体にも、オブジェクトが存在するかどうかという判断があります。存在する場合はオブジェクトが返され、存在しない場合はオブジェクトが作成されて返されます。 インスタンス オブジェクトが作成されるたびに、このような判断層が必要になります。 ファクトリーモデルでは、延長メンテナンスの問題がより考慮されています。 一般に、シングルトン パターンとファクトリ パターンは、より合理的なオブジェクトを生成できます。これらのオブジェクトを簡単に呼び出すにはどうすればよいでしょうか?さらに、このようにしてプロジェクト内で作成されたオブジェクトは、散在する兵士のようなものであり、全体の管理や配置には不便です。そこで、登録ツリー モデルが登場しました。シングルトン モード、ファクトリ モード、またはその 2 つの組み合わせのいずれでオブジェクトを生成したかに関係なく、オブジェクトはすべて登録ツリーに「挿入」されます。オブジェクトを使用するときは、登録ツリーから直接オブジェクトをフェッチするだけです。これは、グローバル変数を使用するのと同じくらい便利で実用的です。 また、登録ツリー パターンは、他のパターンにも非常に良いアイデアを提供します。
登録ツリーを実装するにはどうすればよいですか?
上記の説明を通して、解決策は簡単に見つかったようです。もちろん、最初に登録ツリーとしてクラスが必要です。すべてのオブジェクトが登録ツリーに「挿入」されます。この登録ツリーは静的変数によって提供される必要があります。そして、この登録ツリーは 2 次元配列である必要があります。このクラスにはオブジェクト インスタンスを挿入するメソッド (set()) が必要であり、それに対応してオブジェクト インスタンスを元に戻すメソッド (_unset()) も必要です。もちろん、最も重要なことは、オブジェクトを読み取るメソッド (get()) を用意することです。これで、登録ツリーモードを無事完了できます~~~
3 つのモードを少し組み合わせてみましょう。インスタンス オブジェクトを作成するだけならそれほど複雑ではありませんが、大規模なプロジェクトに適用すると、その利便性は自明です。
リーリーこの時点で、3 つのデザイン モードの導入が完了しました。さまざまなパターン デザイン自体が相互に補完し合い、将来他のパターンを導入する際には、多かれ少なかれ 1 つまたは複数の他のデザイン パターンが使用されます。
特定のモデルを理解していなくても問題ありません。徹底的にプログラミングすることで、突然の進歩が起こると信じています。
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();
一个稍微复杂的工厂模式:
<?php interface Transport{ public function go(); } class Bus implements Transport{ public function go(){ echo "bus每一站都要停"; } } class Car implements Transport{ public function go(){ echo "car跑的飞快"; } } class Bike implements Transport{ public function go(){ echo "bike比较慢"; } } class transFactory{ public static function factory($transport) { switch ($transport) { case 'bus': return new Bus(); break; case 'car': return new Car(); break; case 'bike': return new Bike(); break; } } } $transport=transFactory::factory('car'); $transport->go();
需要工厂静态方法为factory()的时候,千万别再傻乎乎的把工厂类命名为Factory了。为啥啊?别忘了同名构造函数的事儿啊~
最后还是谈点感受吧,很多新手比较眼高手低,刚刚会了if..else..,session,cookie就要来点高大上的了。与人交谈动辄可扩展性,可维护性之类云云,至于实例的话,就会一时语塞。有时候觉得,无论自己写代码还是和别人学习,都处于“众里寻他千百度”的时候,真正踏实学习后,蓦然回首,“那人却在灯火阑珊处”,大呼:“原来这TM就是***啊”。
笔者不敢承认自己会模式设计,我也是个不足一年的初学者,分享博客只是想记录自己的学习历程,能得到知道更是求之不得。如果能给别人带来帮助,那就更好啦~~~
php单列模式
模式设计是什么?
初学者一开始会被这高大上的名称给唬住。而对于有丰富编程经验的老鸟来说,模式设计又是无处不在。很多接触的框架就是基于各种模式设计形成的。 简单说,在写代码的过程中一开始往往接触的是面向过程的,简单的基础的编程。这个时候我们往往追求的是代码能够实现某项功能就万事大吉。管他代码多么冗余,管他代码是否可重用,管他效率如何,能实现功能就好。但是,真正应用于实际的,更被大家采纳的是那些高效的,可重用的,便于团队开发的代码。基于这些因素,你不能像练手一样,随便命名函数名,随便放置脚本。模式设计告诉是给人们组织代码提供一种思路,实现可重用代码、让代码更容易被他人理解、保证代码可靠性。
在所有模式设计中,有三种基础设计模式,单例模式,工厂模式,注册树模式,其他模式往往基于这几种模式,下面介绍的是单例模式。
什么是单例模式?
根据这个名称,我们很容易了解到,单例模式指的是在整个应用中只有一个对象实例的设计模式。
为什么要用单例模式?
php常常和数据库打交道,如果在应用中如果频繁建立连接对象,进行new操作的话,会消耗大料的系统内存资源,这并不是我们希望看到的。再则,在团队合作项目中,单例模式可以有效避免不同程序员new自己的对象,造成人为的系统消耗。
如何建立单例模式?
在看到这个问题的时候,相信优秀的程序员很可能自己试着根据要求去创建单例模式,而不是坐等前人的经验。区别于其他博友告诉你什么样的模式是单例模式,我人更愿意和有面向对象编程基本经验的你考虑一下如何自己建立单例模式。
我们首先从题目出发,单例模式是只有一个对象实例的设计模式。这一点是很让人蛋疼的。我们平常创建的类不是能创建很多对象的,就是不能创建对象的(抽象类)。要创建对象需要有类这是必须的,而且不能是抽象类。这个类要防止别人可以多次创建函数。我们自然而然考虑到了从构造函数入手。但是,每次new操作都会调用构造函数,也就是会多次创建对象实例。这和我们设计初衷相悖了。在此处务必申明构造函数为private或者protected这样才能解决这个问题。
构造函数被申明为private或者protected这注定无法通过new的方法创建实例对象了。而且我们发现,经过这一步处理后,解决问题的前景变得明朗起来?为什么呢?既然无法通过new方法创建对象实例,那么我们只能通过类内的方法来创建对象实例了。 这个时候我们面临一个有趣的先有鸡还是先有蛋的问题。我们往往往往是创建了对象后才调用对象的方法,而此时需要调用类里面的方法来创建对象。不受是否创建对象影响都能调用的方法的解决方案毋庸置疑那就是利用关键字--static。
在类内创建静态方法完成完成什么工作呢?回归主题:确保只创建一个实例对象。如何确保只有一个呢?这很简单,if判断一下啊。存在的话直接返回,不存在自己创建一个嘛。当然这个实例对象是类的静态属性。至此,单例模式要求的功能实现完成。真的完成了么?还不算~如果有个类继承本类,将构造方法申明为public那不又坏事儿了?那有必要在构造方法前加final关键字了。
最后贴上单例模式代码,代码解释都在上面了~~
<?php class Single{ public $hash; static protected $ins=null; final protected function __construct(){ $this->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创建对象,只是换个地方而已,从类外到类内。
最后对研究出各种精妙的模式设计的程序员表示拜服~~