![1e28dc93e2d1b8210457c849fe717112.png](https://i-blog.csdnimg.cn/blog_migrate/d92ba437dff8e6cfbb7df961fdba7721.jpeg)
目的[1]
通过创建一个原型对象,然后复制原型对象来避免通过标准的方式创建大量的对象产生的开销(new Foo())。相比正常创建一个对象 会更节省开销。
示例
- 大数据量 (例如:通过 ORM 模型一次性往数据库插入 1,000,000 条数据) 。
UML 图
![e177ad0cff764e00db6d11b7499f2900.png](https://i-blog.csdnimg.cn/blog_migrate/4e882b36f13d23a54dc593f68ab3c85e.png)
★官方PHP高级学习交流社群,点击进入暗号: phpzh 整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货
代码
- BookPrototype.php
<?php
namespace DesignPatternsCreationalPrototype;
abstract class BookPrototype
{
/**
* @var string
*/
protected $title;
/**
* @var string
*/
protected $category;
abstract public function __clone();
public function getTitle(): string
{
return $this->title;
}
public function setTitle($title)
{
$this->title = $title;
}
}
- BarBookPrototype.php
<?php
namespace DesignPatternsCreationalPrototype;
class BarBookPrototype extends BookPrototype
{
/**
* @var string
*/
protected $category = 'Bar';
public function __clone()
{
}
}
- FooBookPrototype.php
<?php
namespace DesignPatternsCreationalPrototype;
class FooBookPrototype extends BookPrototype
{
/**
* @var string
*/
protected $category = 'Foo';
public function __clone()
{
}
}
测试
- Tests/PrototypeTest.php
<?php
namespace DesignPatternsCreationalPrototypeTests;
use DesignPatternsCreationalPrototypeBarBookPrototype;
use DesignPatternsCreationalPrototypeFooBookPrototype;
use PHPUnitFrameworkTestCase;
class PrototypeTest extends TestCase
{
public function testCanGetFooBook()
{
$fooPrototype = new FooBookPrototype();
$barPrototype = new BarBookPrototype();
for ($i = 0; $i < 10; $i++) {
$book = clone $fooPrototype;
$book->setTitle('Foo Book No ' . $i);
$this->assertInstanceOf(FooBookPrototype::class, $book);
}
for ($i = 0; $i < 5; $i++) {
$book = clone $barPrototype;
$book->setTitle('Bar Book No ' . $i);
$this->assertInstanceOf(BarBookPrototype::class, $book);
}
}
}
八重樱:PHP 互联网架构师成长之路*「设计模式」终极指南
八重樱:PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)
八重樱:面试10家公司,收获9个offer,2020年PHP 面试问题
★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导点击进入暗号: phpzh
![155d2ee56ade4e43c842fc61160177ab.gif](https://i-blog.csdnimg.cn/blog_migrate/fbfbbf839358402f4b0c7c52665f2b68.gif)
参考
- ^内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题和想看的内容可以在评论提出