zoukankan      html  css  js  c++  java
  • PHP设计模式之工厂/单例/注册者模式

    工厂模式

    简单工厂模式 【静态工厂方法模式】(Static Factory Method)
    是类的创建模式

    工厂模式的几种形态:

    1、简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method)

    2、工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory)

    3、抽象工厂模式(Abstract Factory)又叫做 工具箱模式(ToolKit)

    创建工厂类

    <?php
    require_once ("test.php");

    class Factory
    {
    public static function createObj()
    {
    $obj = new test();
    return $obj;
    }
    }

    调用工厂类中的静态方法创建对象

    <?php
    require_once ("Factory.php");

    //$test = new test();
    $test = Factory::createObj();
    echo $test->name;

    单例模式

    创建类的唯一实例

    test.php

    <?php

    class test
    {
    private static $_instance = null;
    private function __construct()
    {
    echo "create obj";
    }
    private function __clone()
    {

    }
    public static function getInstance()
    {
    if (static::$_instance === null)
    {
    static::$_instance = new static;  //使用static替代self,static关键字来访问静态的方法或者变量,与self不同,static的引用是由运行时决定,保证继承有效
    }
    return static::$_instance;
    }
    }

    index.php

    <?php
    require_once ("test.php");

    $obj = test::getInstance();

    注册器模式

    单例模式保证了一个类中只有一个实例被全局访问,当你有一组全局对象被全局访问时可能就需要用到注册者模式 (registry),它 提供了在程序中有条理的存放并管理对象 (object)一种解决方案。一个“注册模式”应该提供get() 和 set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属 性是否已经设置。 
    注册模式通过单一的全局的对象来获取对其它对象的引用

    register.php 注册器读写类

    <?php
    class Registry extends ArrayObject
    {
      private static $_instance = null;
      /**
       * 取得Registry实例
       *
       * @note 单件模式
       *
       * @return object
       */
      public static function getInstance()
      {
        if (self::$_instance === null) {
          self::$_instance = new self();
          echo "new register object!";
        }
        return self::$_instance;
      }
      /**
       * 保存一项内容到注册表中
       *
       * @param string $name 索引
       * @param mixed $value 数据
       *
       * @return void
       */
      public static function set($name, $value)
      {
        self::getInstance()->offsetSet($name, $value);
      }
      /**
       * 取得注册表中某项内容的值
       *
       * @param string $name 索引
       *
       * @return mixed
       */
      public static function get($name)
      {
        $instance = self::getInstance();
        if (!$instance->offsetExists($name)) {
          return null;
        }
        return $instance->offsetGet($name);
      }
      /**
       * 检查一个索引是否存在
       *
       * @param string $name 索引
       *
       * @return boolean
       */
      public static function isRegistered($name)
      {
        return self::getInstance()->offsetExists($name);
      }
      /**
       * 删除注册表中的指定项
       *
       * @param string $name 索引
       *
       * @return void
       */
      public static function remove($name)
      {
        self::getInstance()->offsetUnset($name);
      }
    }
    test.php 需要注册的类
    <?php
    class Test
    {
       function hello()
       {
        echo "hello world";
        return;
       }
    }
    ?>
    index.php 测试类
    <?php
    //引入相关类
    require_once "Registry.class.php";
    require_once "test.class.php";
    //new a object
    $test=new Test();
    //$test->hello();
    //注册对象
    Registry::set('testclass',$test);
    //取出对象
    $t = Registry::get('testclass');
    //调用对象方法
    $t->hello();
    ?>
  • 相关阅读:
    javaWeb学习总结——文件上传、下载
    基于JDK1.8的JVM 内存结构【JVM篇三】
    Mybatis分页插件PageHelper的学习与使用
    使用IntelliJ IDEA创建第一个Mawen项目
    SpringMVC参数绑定学习总结【前后端数据参数传递】
    【2013年】开发常见问题回顾(一)
    Asp.Net统一前后端提示信息方案
    pip的安装以及binascii报错问题
    win32程序一个简单的计算器
    uva815洪水问题
  • 原文地址:https://www.cnblogs.com/-simon/p/5875654.html
Copyright © 2011-2022 走看看