博客列表 >单例,工厂,注册模式案例——2018年5月9日

单例,工厂,注册模式案例——2018年5月9日

Y的博客
Y的博客原创
2018年05月14日 11:43:52724浏览

单列模式:

实例

<?php
/医院
 *单例模式:一个类仅允许创造一个实例
 */
class Config1{}
class Config
{
    private static $instance = null;
    //保存用户的自定义配置参数
    private $setting = [];

    //构造器私有化:禁止从类外部实例化
    private function __construct()
    {
    }

    //克隆方法私有化:禁止从外部克隆对象
    private function __clone()
    {
    }
    //因为用静态属性返回类实例,而只能在静态方法使用静态属性
    //所以必须创建一个静态方法来生成当前类的唯一实例
    public static function getInstance()
    {
        //检测当前类属性$instance是否已经保存了当前类的实例
        if (self::$instance == null) {
            //如果没有,则创建当前类的实例
            self::$instance = new self();
        }
        //如果已经有了当前类实例,就直接返回,不要重复创建类实例
        return self::$instance;
    }

    //设置配置项
    public function set($index, $value)
    {
        $this->setting[$index] = $value;
    }
    //读取配置项
    public  function  get($index)
    {
        return  $this->setting[$index];
    }
}
$obj1 = new Config1;
$obj2 = new Config1;
var_dump($obj1,$obj2);

echo '<hr>';

//实例化Config类
$obj1 = Config::getInstance();

$obj2 = Config::getInstance();

var_dump($obj1, $obj2);

$obj1->set('host', 'localhost');
echo $obj1->get('host');

运行实例 »

点击 "运行实例" 按钮查看在线实例

工厂模式:

实例

<?php
/医院
 * 工厂模式:用于创建多种类型的多个实例对象
 */
//声明形状类
class Shape
{
    //声明静态方法create,根据容器形状不同,创建不同图形类的实例
    public static function create($type,array $size=[])
    {
     //检测形状?
    switch($type)
        {
        //长方形
        case 'rectangle':
            return new Rectangle($size[0],$size[1]);
            break;
         //三角形
         case 'triangle':
         return new Triangle($size[0],$size[1]);
          break;
          }
      }
}
//声明长方形类
class Rectangle
{
  private $width;
  private $height;
  public function __construct($width,$height)
  {
      $this->width = $width;
      $this->height = $height;
  }
  public function area()
  {
      return $this->width * $this->height;
  }
}

//声明三角形类
class Triangle
{
    private $bottom;  //底边
    private $height;  //边长
    public function __construct($bottom,$height)
    {
        $this->bottom = $bottom;
        $this->height = $height;
    }

    //计算三角形面积:  (底 * 高) / 2
    public function area()
    {
        return ($this->bottom * $this->height)/2;
    }
}
//使用静态方法来实例化形状类,而不是用传统的new 关键字
//并根据形状类型参数的不同,来实例化不同的类,生成不同的对象
$rectangle = Shape::create('rectangle',[4,5]);
echo '长方形的面积是'.$rectangle->area();
echo '<hr>';
$triangle = Shape::create('triangle',[2,5]);
echo '三角形的面积是'.$triangle->area();

运行实例 »

点击 "运行实例" 按钮查看在线实例

注册树模式:

实例

<?php
/*
 * 注册树:其实就是创建一个对象集,也叫对象池,是用数组来进行存储的
 */

class Demo1 {}
class Demo2 {}
class Demo3 {}

//声明对象注册树类
class Register
{
    //静态属性中保存着所有已经挂载到树上的对象
    public static $objs = [];

    //将对象挂载到树上
    public static function set($index,$obj)
    {
        self::$objs[$index] = $obj;
    }
    //取出对象使用
    public static function get($index)
    {
        return self::$objs[$index];
    }
    //已经无效的对象,及时销毁,节省资源
    public static function del($index)
    {
        unset(self::$objs[$index]);
    }
}
//先将三个类实例化后挂载到对象树上
Register::set('demo1',new Demo1);
Register::set('demo2',new Demo2);
Register::set('demo3',new Demo3);
//检测是否上树?
var_dump(Register::$objs);
echo '<hr>';
echo '<pre>'.print_r(Register::$objs,true).'</pre>';
echo '<hr>';
//用注册类的get方法查看
var_dump(Register::get('demo2'));
//删除对象池中的某个实例对象
Register::del('demo2');
//再次查看demo2对象,已经不能被查看了,因为被销毁了
var_dump(Register::get('demo2'));

运行实例 »

点击 "运行实例" 按钮查看在线实例

总结:

单例模式:一个类仅允许创造一个实例

工厂模式:用于创建多种类型的多个实例对象

注册树:其实就是创建一个对象集,也叫对象池,是用数组来进行存储的

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议