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

单例,工厂,注册模式的案例—2018年5月10日13点

旺小舞的博客
旺小舞的博客原创
2018年05月10日 13:45:521019浏览

单列模式:一个类只允许实例化一次

<?php
/**
 * 单列模式:一个类只允许实例化一次
 * 一对一
 */
class Config1
{
//$obj1 =new Config1();
//$obj2 =new Config1();
//var_dump($obj1,$obj2);    这里能创建出两个不一样的对象,而目标是一个对象
    //静态成员是类,类所有类成员共享
    //私有化不允许外部访问
    //后期需检测是否被实例化
    private static $instance =null;
    //保持用户自定义配置
    private $setting =[];

    private function  __construct()
    {
    }
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    public static function  getInstance()
    {
        //检测是否被实例化
        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];
    }
}
//实例化Config
$obj= Config1::getInstance();
//$obj2= Config1::getInstance();
//var_dump($obj1,$obj2);
$obj->set('host','localhost');
echo $obj->get('host');

//输出:localhost

运行实例 »

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

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

/**
 * 工厂模式:用于创建多种类型的多个实例对象
 * 单列模式:用于创建单一类型的单个实例对象
 */
//$obj = create($class);
//实例:根据不同形状计算面积
header("Content-type:text/html;charset=utf-8");
class Shape
{
    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 $width;
    private $height;

    public function __construct($width,$height)
    {
        $this->width=$width;
        $this->height=$height;
    }
    public function area()
    {
        return ($this->width*$this->height)/2;
    }
}

//执行  静态方法实例化形状类
$rectangle=Shape::create('rectangle',[10,20]);
echo '长方形的面积是:'.$rectangle->area();
//长方形的面积是:200
echo '<hr>';
$triangle =Shape::create('triangle',[10,20]);
echo '三角形的面积是:'.$triangle->area();
//三角形的面积是:100

运行实例 »

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

注册树/对象池模式:其实就是一个对象集合,或者对象池,直接用数组来存储对象

<?php
/**
 * 注册树/对象池模式:其实就是一个对象集合,或者对象池,直接用数组来存储对象
 */
class demo1{}
class demo2{}
class demo3{}
class demo4{}

//声明注册树类
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);
Register::set('demo4',new Demo4);

var_dump(Register::get('demo2'));
echo '<hr>';
var_dump(Register::get('demo3'));
Register::del('demo2');
var_dump(Register::get('demo2'));
//Undefined index: demo2

运行实例 »

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


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