欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例,工厂,注册模式的案例—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

运行实例 »

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


上一篇:

下一篇: