博主信息
墨雨的博客
博文
46
粉丝
3
评论
2
访问量
22211
积分:1
P豆:342.53

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

2018年05月10日 19:15:08阅读数:552博客 / 墨雨的博客/ PHP中文网2期培训班作业

1、单例模式:一个类仅允许创建一个实例

实例

<?php 
/**
 * 单例模式:一个类仅允许创建一个实例
 */

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];
	}
}

//实例化Config类
$obj = Config::getInstance();
$obj->set('host','localhost');
echo $obj->get('host');
运行实例 »

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

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

实例

<?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($witch,$height)
    {
        $this->width = $witch;
        $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',[10,30]);
echo '长方形的面积是'.$rectangle->area();
$triangle = Shape::create('triangle',[20,50]);
echo '三角形的面积是'.$triangle->area();

运行实例 »

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

3、注册树:创建一个对象集,是用数组来进行存储的

实例

<?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举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论