<?php
declare(strict_types=1);
// php 技术群:781742505
// 抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、
// 抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、
// 抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、抽象工厂、
interface Product
{
public function calculatePrice(): int;
}
class ShippableProduct implements Product
{
private $productPrice;
private $shippingCosts;
public function __construct(int $productPrice, int $shippingCosts)
{
$this->productPrice = $productPrice;
$this->shippingCosts = $shippingCosts;
}
public function calculatePrice(): int
{
return $this->productPrice + $this->shippingCosts;
}
}
class DigitalProduct implements Product
{
private $price;
public function __construct(int $price)
{
$this->price = $price;
}
public function calculatePrice(): int
{
return $this->price;
}
}
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);
}
}
$factory = new ProductFactory();
$product = $factory->createShippableProduct(150);
echo $product->calculatePrice();
echo "\n";
// 静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、
// 静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、
// 静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、静态工厂、
final class StaticFactory
{
/**
* @param string $type
*
* @return Formatter
*/
public static function factory(string $type): Formatter
{
if ($type == 'number') {
return new FormatNumber();
} elseif ($type == 'string') {
return new FormatString();
}
throw new \InvalidArgumentException('Unknown format given');
}
}
interface Formatter
{
public function format(string $input): string;
}
class FormatString implements Formatter
{
public function format(string $input): string
{
return $input;
}
}
class FormatNumber implements Formatter
{
public function format(string $input): string
{
return number_format($input);
}
}
// assertInstanceOf(
// 'DesignPatterns\Creational\StaticFactory\FormatNumber',
// StaticFactory::factory('number')
// );
// 简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、
// 简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、
// 简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、简单工厂、
// 抽象工厂和简单工厂的区别?
// 我的理解是,抽象工厂生产的是一系列具有相同接口的工厂。
// 然而简单工厂只是生产任意工厂。
class SimpleFactory
{
public function createBicycle(): Bicycle
{
return new Bicycle();
}
}
class Bicycle
{
public function driveTo(string $destination)
{
}
}
$factory = new SimpleFactory();
$bicycle = $factory->createBicycle();
$bicycle->driveTo('Paris');
// 工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、
// 工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、
// 工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、工厂方法、
interface Logger
{
public function log(string $message);
}
class StdoutLogger implements Logger
{
public function log(string $message)
{
echo $message;
}
}
class FileLogger implements Logger
{
/**
* @var string
*/
private $filePath;
public function __construct(string $filePath)
{
$this->filePath = $filePath;
}
public function log(string $message)
{
file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
}
}
interface LoggerFactory
{
public function createLogger(): Logger;
}
class StdoutLoggerFactory implements LoggerFactory
{
public function createLogger(): Logger
{
return new StdoutLogger();
}
}
class FileLoggerFactory implements LoggerFactory
{
/**
* @var string
*/
private $filePath;
public function __construct(string $filePath)
{
$this->filePath = $filePath;
}
public function createLogger(): Logger
{
return new FileLogger($this->filePath);
}
}
$loggerFactory = new StdoutLoggerFactory();
$logger = $loggerFactory->createLogger();
//$this->assertInstanceOf(StdoutLogger::class, $logger);
各种工厂模式
最新推荐文章于 2025-04-17 15:25:54 发布
9600

被折叠的 条评论
为什么被折叠?



