PHP三大经典设计模式

2019年8月10日23:21:28来源:慕课网:浪子编程走四方 2 35
华为云学生机

单例模式

含义:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

三个要素:

  1. 保存类唯一实例的静态变量。
  2. 构造函数和克隆函数必须是私有的,放在外部去实例化,这样就不存在单例模式的意义。
  3. 提供一个可供外部访问的公共方法,这个方法返回该类的唯一实例。

意义:在PHP中的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。而不完全是对系统资源的节省, 可以避免重复实例化,因为PHP每次实例化一个类之后都会清理掉对应的资源,当再次使用的时候又会在重新去实例化一次。

使用的场景:

  1. 数据库操作,减少对数据路的new操作,从而减少内存资源和系统资源的消耗。
  2. 配置资源的共享,在一个系统中,配置资源都是全局的,使用单例模式也可以减少每次去读取配置带来的内存和系统资源的消耗。

代码演示:

  1. <?php
  2. class Single {
  3.     public static $attribute = '';
  4.     public static $instance = '';
  5.     private function __construct($attribute = '萧瑟') {
  6.         self::$attribute = $attribute;
  7.     }
  8.     public static function getInstance($attribute = '我是萧瑟1') {
  9.         if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
  10.         return self::$instance;
  11.     }
  12. }

工厂模式

含义:负责生成其他对象的方法。简单的描述就是通过一个工厂类,去实例化其他类或者方法。

工厂模式的意义:通过使用工厂模式,减少因为多处new同一个类,当这个类发生变法时,则需要多处修改。

代码演示:

  1. <?php
  2. class Factor {
  3.     public static function createDB() {
  4.         echo '我生产了一个DB实例';
  5.         return new DB;
  6.     }
  7. }
  8. class DB {
  9.     public function __construct() {
  10.         echo __CLASS__ . PHP_EOL;
  11.     }
  12. }
  13. $db = Factor::createDB();

注册树模式

含义:注册树就是将多个对象注册在一个对象池中,当我们需要使用时,直接从对象池获取即可。

优点:单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。 那么注册树模式想解决什么问题呢? 在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限。 首先,单例模式创建唯一对象的过程本身还有一种判断,即判断对象是否存在。存在则返回对象,不存在则创建对象并返回。 每次创建实例对象都要存在这么一层判断。 工厂模式更多考虑的是扩展维护的问题。 总的来说,单例模式和工厂模式可以产生更加合理的对象。怎么方便调用这些对象呢?而且在项目内如此建立的对象好像散兵游勇一样,不便统筹管理安排啊。因 而,注册树模式应运而生。不管你是通过单例模式还是工厂模式还是二者结合生成的对象,都统统给我“插到”注册树上。我用某个对象的时候,直接从注册树上取 一下就好。这和我们使用全局变量一样的方便实用。 而且注册树模式还为其他模式提供了一种非常好的想法。

代码演示:

  1. <?php
  2. /**
  3.  * 单例模式 
  4.  */
  5. class Single
  6. {
  7.     public static $attribute = '';
  8.     public static $instance = '';
  9.     private function __construct($attribute = '蕭瑟')
  10.     {
  11.         self::$attribute = $attribute;
  12.     }
  13.     public static function getInstance($attribute = '蕭瑟1')
  14.     {
  15.         if (!(self::$instance instanceof self))
  16.             self::$instance = new self($attribute);
  17.             return self::$instance;
  18.     }
  19. }
  20. /** 
  21.  * 工厂模式 
  22.  */
  23. class Factory
  24. {
  25.     public static function createObj() {
  26.         return Single::getInstance('蕭瑟');
  27.     }
  28. }
  29. /** 
  30.  * 注册模式 
  31.  * 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找. 
  32.  * 需要如下几个操作: 
  33.  * 1.注册 
  34.  * 2.存放对象池 
  35.  * 3.获取 
  36.  * 4.销毁 
  37.  */
  38. Class Register {
  39.     // 用一个数组来当做对象池,键当做对象别名,值存储具体对象 
  40.     public static $objTree = [];
  41.     // 将对象放在对象池 
  42.     public static function set($key$val)
  43.     {
  44.         return self::$objTree[$key] = $val;
  45.     }
  46.     // 通过对象别名在对象池中获取到对象别名 
  47.     public static function get($key) {
  48.         return self::$objTree[$key];
  49.     }
  50.     // 通过对象别名将对象从对象池中注销 
  51.     public static function _unset($key) {
  52.         unset(self::$objTree[$key]);
  53.     }
  54. }
  55. Register::set('single', Factory::createObj());
  56. $single = Register::get('single');
  57. print_r($single);
  58. echo $single::$attribute;

 

weinxin
微信公众号
博客微信公众号,欢迎关注。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:2   其中:访客  1   博主  1

    • avatar 阿小州 5

      路过路过小白一个还没看懂!

        • avatar 萧瑟  博主

          @阿小州 慢慢学习。每个人基本上都是从小白进化而来。