PHP 之设计模式学习笔记 - 原型模式

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());
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值