PHP常用设计模式之“单例模式与工厂模式“

单例模式

  1. 一个类,仅允许被实例化一次,即仅允许某个类创建一个实例
  2. 应用场景:数据库连接,HTTP请求…

总结三点:

  1. 构造方法私有化
  2. 外部的clone(克隆),私有化
  3. 创建一个静态方法,用它来生成当前类的实例
namespace Demo;
 //普通模式
class Demo
{
	
}

$obj1 = new Demo();
$obj2 = new Demo();

var_dump($obj1);
echo '<br>';
var_dump($obj2);
echo '<br>';
//认为Demo类被实例化了2次
var_dump($obj1 === $obj2);
echo '<hr>';


//单例模式
class Demo2
{
	//构造方法私有化
	private function __construct()
	{
	}
	private static $instance = null;

	//生成当前类的唯一实例对象
	public static function getInstance()
	{
	//判断下当前类的实例为NULL,说明还没有被实例化过,是第一次,允许实例化
		if (is_null(self::$instance)) {
			self::$instance = new self;
		}
	//返回当前的实例给调用者
	return self::$instance;
	}

	//禁用外部clone方式创建新对象
	private function __clone()
	{
		echo '外部的clone方法被调用了.<br>';
	}
}

$obj1 = Demo1::getInstance();
var_dump($obj1);
echo '<br>';

//克隆方法,已经在上面被禁用
//$obj2 = clone $obj1;

//对象之间是可以互相复制的:引用赋值
$obj2 = $obj1;
var_dump($obj2);

echo '<br>';
var_dump($obj1 === $obj2);

工厂模式

  1. 主要用于批量创建对象,使创建对象的过程剥离出来,标准化
  2. 适用于一个类有多个实例,而这些实例会在不同的地方被创建和引用
  3. 使用工厂模式来创建对象,可以实现,一处修改,全局生效
<?php
namespace Demo;

//工厂模式
//主要用于批量创建对象,使创建对象的过程剥离出来,标准化
//适用于一个类有多个实例,而这些实例会在不同的地方被创建和引用
//使用工厂模式来创建对象,可以实现,一处修改,全局生效

/*例如:
class Demo888
{
}

该类的一些实例,有可能被多个文件所引用
file1.php
$obj = Factory::create('Demo888');

file2.php
$obj = new Demo888();

file3.php
$obj = new Demo888();
*/


use inc\Tset2;
use inc\Tset3;

class Test1
{
    public function __construct($arg1)
    {
        echo  '对象创建成功, 参数是: ' . $arg1;
    }
}

class Test2
{
    public function __construct($arg1, $arg2)
    {
        echo  '对象创建成功, 参数是: ' . implode(', ',[$arg1, $arg2]);
    }
}

class Test3
{
    public function __construct($arg1, $arg2, $arg3)
    {
        echo  '对象创建成功, 参数是: ' . implode(', ',[$arg1, $arg2, $arg3]);
    }
}

class Test4
{
    public function __construct()
    {
        echo  '对象创建成功, 无参数~~';
    }
}

// 工厂类: 专用用实例化类
class Factory
{
    /**
     * @param $className: 需要实例化的类名称
     * @param mixed ...$arguments: 实例化传给构造方法的参数
     * @return object 类实例
     */
    public static function create($className, ...$arguments)
    {
        return new $className(...$arguments);
    }
}

Factory::create(Test1::class, 100);

echo '<hr>';

Factory::create(Test2::class,100,200);

echo '<hr>';

Factory::create(Test3::class,100,200,300);

echo '<hr>';

Factory::create(Test4::class);

待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值