各种工厂模式

<?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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值