PHP 之设计模式学习笔记(自用) - 原型模式
原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可。
使用场景:
大数据量(例如:通过ORM 模型一次性往数据库中插入1,000,000条数据)
实例:
抽象原型角色:声明一个克隆自身的抽象类
<?php
namespace App\Service\DesignPattern\Prototype;
use App\Models\Topic;
use Illuminate\Database\Eloquent\Model;
abstract class BookPrototype
{
/**
* @var string
*/
protected $title;
/**
* @var string
*/
protected $category;
abstract public function __clone();
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @param $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @return string
*/
public function getCategory()
{
return $this->category;
}
/**
* @param $title
*/
public function setCategory($category)
{
$this->category = $category;
}
/**
* ......
*/
/**
* 批量赋值
* @param $data
*/
public function setData($data)
{
$this->setTitle($data['title']);
// ......
}
/**
* 添加数据库操作
* @return \Illuminate\Database\Eloquent\Builder|Model
*/
public function addData()
{
return Topic::query()->create([
'title' => $this->getTitle(),
'category' => $this->getCategory(),
]);
}
}
实现
<?php
namespace App\Service\DesignPattern\Prototype;
class BarBookPrototype extends BookPrototype
{
protected $category = 'Bar';
public function __clone()
{
// TODO: Implement __clone() method.
}
public function setData($data)
{
parent::setData($data);
$this->setCategory($data['category']);
return $this;
}
}
调用
$data = [
['title' => '书籍', 'category' => 'Book'],
['title' => '学习', 'category' => 'student'],
['title' => '上课', 'category' => 'GoGoGo'],
['title' => '自学', 'category' => 'YesYes'],
];
try {
$book = new BarBookPrototype();
foreach ($data as $mysqlDatum) {
$bookClone = clone $book;
$bookClone->setData($mysqlDatum);
$bookClone->addData();
}
return true;
} catch (\Exception $exception) {
throw new \Exception($exception->getMessage());
}