单例模式
- 一个类,仅允许被实例化一次,即仅允许某个类创建一个实例
- 应用场景:数据库连接,HTTP请求…
总结三点:
- 构造方法私有化
- 外部的clone(克隆),私有化
- 创建一个静态方法,用它来生成当前类的实例
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);
工厂模式
- 主要用于批量创建对象,使创建对象的过程剥离出来,标准化
- 适用于一个类有多个实例,而这些实例会在不同的地方被创建和引用
- 使用工厂模式来创建对象,可以实现,一处修改,全局生效
<?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);
待续…