博客列表 >单例模式,工厂模式,注册树模式 ---2018年5月15日

单例模式,工厂模式,注册树模式 ---2018年5月15日

失去过去的博客
失去过去的博客原创
2018年05月15日 09:57:041050浏览

1.单例模式

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/5/10 0010
 * Time: 13:14
 *单例模式:一个类允许创建一个实例对象
 * 1.一个站点只能允许链接一个数据库
 * 2.一个站点只能允许一个配置类的实例对象
 *
 */
class demo{}
class Config
{
    /*
     * 必须先声明一个静态的私有属性 用来保存当前类的实例
     * 1.为什么必须是静态属性:因为静态成员是属于类并被类的所有实例共享
     * 2.为什么是私有的:不允许外部直接访问 经允许通过类的控制方法
     * 3.为什么声明为null;因为外部引用的时候需要检测实例的状态 判断是否被实例化

     *
     * */
    private static $instence = null;
    //保存用户定义的配置参数
    private $setting = [];
    //构造器私有化 禁止外部实例化
    private function __construct()
    {
    }
    //克隆方法私有化 禁止外部克隆对象
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }
    //因为静态属性返回类实例 只能在静态方法中访问静态属性
    //必须创建一个静态方法来生成当前类的唯一实例
    public static function getInstence()
    {
        //检测外部是否已经实例化对象
        if(self::$instence == null){
            //没有实例化则实例化
            self::$instence = new self();
        }
        //返回实例化对象
        return self::$instence;
    }
    //设置配置项
    public function set($index,$value)
    {
        $this->setting[$index] = $value;
    }
    //读取配置项
    public function get($index)
    {
      return   $this->setting[$index];
    }
}
$obj1 = new demo();
$obj2 = new demo();
var_dump($obj1,$obj2);
echo '<hr>';
$obj3 = Config::getInstence();
$obj4 = Config::getInstence();
var_dump($obj3,$obj4);
echo '<hr>';
$obj4->set('host','127.0.0.1');
echo $obj4->get('host');

运行实例 »

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

2.工厂模式

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/5/10 0010
 * Time: 14:15
 * 工厂模式.
 *1.用于创建多种类型的多个实例对象
 */
//声明一个形状类
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->height = $height;
         $this->width = $width;
     }
     //计算面积
     public function S()
     {
        return $this->height * $this->width;

     }
}
//声明一个三角形
class Triangle
{
    private $bottom;
    private $height;
    //初始化数据
    public function __construct($bottom,$height)
    {
        $this->height = $height;
        $this->bottom = $bottom;
    }
    //计算面积
    public function S()
    {
        return ($this->height * $this->bottom)/2;

    }
}
//调用静态方法
$test =  Shape::create('rectangle',[10,30]);
echo $test->S().'<hr>';

$test2 =  Shape::create('triangle',[16,30]);
echo $test2->S();

运行实例 »

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

3.注册树模式

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/5/10 0010
 * Time: 13:57
 * 注册树模式
 * 1.原理是创建一个对象集合 也叫做对象池,用数组把这些对象存储;
 */
//声明多个类
class demo1{}
class demo2{}
class demo3{}
class demo4{}
//声明注册树对象
class regedit
{
    //声明一个静态公有的属性来储存对象集合
    public static $objs = [];
    //将对象储存进数组 上树
    public static function set($index,$value)
    {
        self::$objs[$index] = $value;
    }
    //将对象取出来使用
    public  static function get($index)
    {
        return self::$objs[$index];
    }
    //使用完销毁 节省资源
    public static function  delete($index)
    {
        unset(self::$objs[$index]);
    }
}
//上树
regedit::set('demo1',new demo1());
regedit::set('demo2',new demo2());
regedit::set('demo3',new demo3());
regedit::set('demo4',new demo4());
//检测是否上树
var_dump(regedit::$objs);
echo '<hr>';
//使用get方法查看
var_dump(regedit::get('demo2')) ;
echo '<hr>';
//销毁
regedit::delete('demo1');
var_dump(regedit::$objs);

运行实例 »

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


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