Gökhan Ensep
2 min readJan 25, 2019

Abstract Factory Design Pattern

Merhabalar,

Bu yazımda Abstract Factory Design Pattern hakkında bilgi vermeye çalışacağım.

Abstract Factory, Creational Design Pattern grubundadır. Bu tasarım deseninin asıl amacı ilişkili olan birbirinden farklı olan nesnelerin üretimini farklı arayüzler tanımlayarak oluşturmaktır.

Abstract Factory desenini oluştururken ilk olarak ortak bir arayüz belirliyoruz. En alt nesneleri(ProductX, ProductY) oluşturmak için de bu ortak arayüzü(AbstractFactory) genişleten (AbstractProductX, AbstractProductY) sınıfları oluşturulur. Aslında bütün nesneler bağlı oldukları sınıfa ait özellikleri taşırlar. Ancak ortak bir arayüze sahip oldukları için birbirleriyle uyumlu bir şekilde çalışabilirler.

Örnekle açıklayalım:

namespace DesignPattern\Creational\AbstractFactory;
abstract class AbstractFactory {
abstract public function createProductX(): AbstractProductX;
}
class ProductFactory extends AbstractFactory {
public function createProductX(): AbstractProductX {
return new ProductX();
}
public function createProductY(): AbstractProductY {
return new ProductY();
}
}
abstract class AbstractProductX {
abstract public function superProduct(): string;
}
class ProductX extends AbstractProductX {
public function superProduct(): string {
return 'This is super product';
}
}
abstract class AbstractProductY {
abstract public function badProduct(): string;
}
class ProductY extends AbstractProductY {
public function badProduct(): string {
return 'No, no, no this is bad product.';
}
public function accessAnotherProduct(AbstractProductX $product): string {
$super = $product->superProduct();
return sprintf('Product type: %s', $super);
}
}

Testlerini de yazalım:

namespace DesignPatternTest\Creational;use DesignPattern\Creational\AbstractFactory\AbstractProductX;
use DesignPattern\Creational\AbstractFactory\AbstractProductY;
use DesignPattern\Creational\AbstractFactory\ProductFactory;
use DesignPattern\Creational\AbstractFactory\ProductX;
use PHPUnit\Framework\TestCase;
class AbstractFactoryTest extends TestCase {
public function testProductX() {
$factory = new ProductFactory();
$this->assertInstanceOf(AbstractProductX::class, $factory->createProductX());
}
public function testProductY() {
$factory = new ProductFactory();
$this->assertInstanceOf(AbstractProductY::class, $factory->createProductY());
}
public function testAccessAnotherProduct() {
$factory = new ProductFactory();
$this->assertEquals( 'Product type: This is super product',
$factory->createProductY()->accessAnotherProduct(new ProductX()) );
}
}

Kod örneğini Github adresimden inceleyebilirsiniz.

Esen kalın.