博主信息
博文 15
粉丝 0
评论 1
访问量 13144
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
设计模式----5.9日作业
吴明的博客
原创
850人浏览过

三个设计模式 :单例,工厂,注册树


实例

<?php
/*单例模式:一个类仅允许创建一个实例
*/
class Config
{
	/*
	必须先创建一个私有静态属性并且赋值为null,
	 */
	private static $instance = null;
	private $setting = [];
	//构造器私有化,因为类不允许外部实例化
	private function __construct()
	{

	}
	//克隆方法私有化:禁止从外部克隆对象
	private function __clone(){}
	public static function getInstance()
	{
		if(self::$instance == null){
			self::$instance = new self();
		}
		//如果已经有了当前实例
		return self::$instance;
	}


}

/*
工厂模式:用于创建多种类型的多个实例对象
 */
class Shape
{
	public static function create($type,array $size=[])
	{
	swich($type)
		{
		//长方形
		case 'retangle':
		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;
    }
}


/* 
 * 注册树:其实就是创建一个对象集,也叫对象池,是用数组来进行存储的
 * 原理非常的简单
 */
//先声明三个类,一会丢进对象树上中
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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学