单例,工厂,注册模式的案例—2018年5月10日13点
程序员文章站
2023-12-28 08:15:46
...
单列模式:一个类只允许实例化一次
<?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
运行实例 »
点击 "运行实例" 按钮查看在线实例