Nesneleri standart yolla (örn. new Foo()) oluşturmanın maliyetinden kaçınmak, bunun yerine bir prototip oluşturmak ve klonlamak için kullanılır. Yüksek oranda veri oluşturma (örn. ORM aracılığıyla bir veritabanında aynı anda 1.000.000 satır oluşturma) işlemlerinde kullanmak bu desen için uygundur.
<?php // BookPrototype.php declare(strict_types=1); namespace DesignPatterns\Creational\Prototype; abstract class BookPrototype { protected string $title; protected string $category; abstract public function __clone(); public function getTitle(): string { return $this->title; } public function setTitle(string $title): void { $this->title = $title; } } // BarBookPrototype.php declare(strict_types=1); namespace DesignPatterns\Creational\Prototype; class BarBookPrototype extends BookPrototype { protected string $category = 'Bar'; public function __clone() { } } // FooBookPrototype.php declare(strict_types=1); namespace DesignPatterns\Creational\Prototype; class FooBookPrototype extends BookPrototype { protected string $category = 'Foo'; public function __clone() { } }
Bu örneğe ait Test;
<?php // Tests/PrototypeTest.php declare(strict_types=1); 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); } } }
İlk Yorumu Siz Yapın