目的
相比正常创建一个对象 (new Foo () ),首先创建一个原型,然后克隆它会更节省开销。
示例
大数据量 (例如:通过 ORM 模型一次性往数据库插入 1,000,000 条数据) 。
代码
BookPrototype.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?php
namespace DesignPatterns\Creational\Prototype;
abstract class BookPrototype {
protected $title;
protected $category;
abstract public function __clone();
public function getTitle(): string { return $this->title; }
public function setTitle($title) { $this->title = $title; } }
|
BarBookPrototype.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
namespace DesignPatterns\Creational\Prototype;
class BarBookPrototype extends BookPrototype {
protected $category = 'Bar';
public function __clone() { } }
|
FooBookPrototype.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
namespace DesignPatterns\Creational\Prototype;
class FooBookPrototype extends BookPrototype {
protected $category = 'Foo';
public function __clone() { } }
|
测试
Tests/PrototypeTest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?php
namespace DesignPatterns\Creational\Prototype\Tests;
use DesignPatterns\Creational\Prototype\BarBookPrototype; use DesignPatterns\Creational\Prototype\FooBookPrototype; use PHPUnit\Framework\TestCase;
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); } } }
|