在不指定具體類的狀況下建立一系列相關或依賴對象。 一般建立的類都實現相同的接口。 抽象工廠的客戶並不關心這些對象是如何建立的,它只是知道它們是如何一塊兒運行的。php
★官方PHP高級學習交流社羣「點擊」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨laravel
<?php namespace DesignPatterns\Creational\AbstractFactory; interface Product { public function calculatePrice(): int; }
<?php namespace DesignPatterns\Creational\AbstractFactory; class ShippableProduct implements Product { /** * @var float */ private $productPrice; /** * @var float */ private $shippingCosts; public function __construct(int $productPrice, int $shippingCosts) { $this->productPrice = $productPrice; $this->shippingCosts = $shippingCosts; } public function calculatePrice(): int { return $this->productPrice + $this->shippingCosts; } }
<?php namespace DesignPatterns\Creational\AbstractFactory; class DigitalProduct implements Product { /** * @var int */ private $price; public function __construct(int $price) { $this->price = $price; } public function calculatePrice(): int { return $this->price; } }
<?php namespace DesignPatterns\Creational\AbstractFactory; class ProductFactory { const SHIPPING_COSTS = 50; public function createShippableProduct(int $price): Product { return new ShippableProduct($price, self::SHIPPING_COSTS); } public function createDigitalProduct(int $price): Product { return new DigitalProduct($price); } }
Tests/AbstractFactoryTest.phpgit
<?php namespace DesignPatterns\Creational\AbstractFactory\Tests; use DesignPatterns\Creational\AbstractFactory\DigitalProduct; use DesignPatterns\Creational\AbstractFactory\ProductFactory; use DesignPatterns\Creational\AbstractFactory\ShippableProduct; use PHPUnit\Framework\TestCase; class AbstractFactoryTest extends TestCase { public function testCanCreateDigitalProduct() { $factory = new ProductFactory(); $product = $factory->createDigitalProduct(150); $this->assertInstanceOf(DigitalProduct::class, $product); } public function testCanCreateShippableProduct() { $factory = new ProductFactory(); $product = $factory->createShippableProduct(150); $this->assertInstanceOf(ShippableProduct::class, $product); } public function testCanCalculatePriceForDigitalProduct() { $factory = new ProductFactory(); $product = $factory->createDigitalProduct(150); $this->assertEquals(150, $product->calculatePrice()); } public function testCanCalculatePriceForShippableProduct() { $factory = new ProductFactory(); $product = $factory->createShippableProduct(150); $this->assertEquals(200, $product->calculatePrice()); } }
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)sql
面試10家公司,收穫9個offer,2020年PHP 面試問題shell
★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣-點擊此處(羣號碼856460874)。設計模式
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出服務器