Factory Method
This commit is contained in:
parent
91f8ded888
commit
0f4618edf5
File diff suppressed because one or more lines are too long
58
code/factory_method.php
Normal file
58
code/factory_method.php
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 12:16
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
use Pattern\Creational\FactoryMethod\{CashlessPayment, CashPayment, Order, PaymentHelper};
|
||||||
|
use Random\RandomException;
|
||||||
|
|
||||||
|
function execute(string $scope): void
|
||||||
|
{
|
||||||
|
echo '<hr/>' . ucfirst($scope) . ' App Payments:<hr/>' . PHP_EOL;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$orderData = [
|
||||||
|
[
|
||||||
|
'order' => new Order(getFloatRange()),
|
||||||
|
'paymentType' => 'privat',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'order' => new Order(getFloatRange()),
|
||||||
|
'paymentType' => 'raiffeisen',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'order' => new Order(getFloatRange()),
|
||||||
|
'paymentType' => 'ing',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'order' => new Order(getFloatRange()),
|
||||||
|
'paymentType' => 'otp',
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($scope === 'web') {
|
||||||
|
$orderData[] = [
|
||||||
|
'order' => new Order(getFloatRange()),
|
||||||
|
'paymentType' => 'cash',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($orderData as $orderDataItem) {
|
||||||
|
['order' => $order, 'paymentType' => $type] = $orderDataItem;
|
||||||
|
|
||||||
|
$payment = PaymentHelper::getPaymentFactory($type)->createPayment();
|
||||||
|
$payment->pay($order);
|
||||||
|
}
|
||||||
|
} catch (RandomException $e) {
|
||||||
|
echo $e->getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
execute('web');
|
||||||
|
execute('mobile');
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types = 1);
|
declare(strict_types = 1);
|
||||||
|
|
||||||
use Pattern\Creational\{Singleton, Sub\Single};
|
use Pattern\Creational\{Singleton\Single, Singleton\Singleton};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The client code.
|
* The client code.
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
<!doctype html>
|
<?php
|
||||||
|
require '../vendor/autoload.php';
|
||||||
|
require '../src/helpers.php';
|
||||||
|
?><!doctype html>
|
||||||
<html lang="uk">
|
<html lang="uk">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
@ -10,31 +13,49 @@
|
|||||||
<script src="assets/js/highlight.min.js"></script>
|
<script src="assets/js/highlight.min.js"></script>
|
||||||
<script src="assets/js/stylus.min.js"></script>
|
<script src="assets/js/stylus.min.js"></script>
|
||||||
<style>
|
<style>
|
||||||
|
html, body {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100dvh;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: #ddd;
|
||||||
|
color: #1c1b19;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
box-shadow: -1px 1px 5px 0 rgba(123, 123, 123, 1);
|
||||||
|
-webkit-box-shadow: -1px 1px 5px 0 rgba(123, 123, 123, 1);
|
||||||
|
-moz-box-shadow: -1px 1px 5px 0 rgba(123, 123, 123, 1);
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 1280px;
|
||||||
|
margin: 0 auto;
|
||||||
|
outline: dotted 1px #a9a49f;
|
||||||
|
padding: 1rem;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
font-family: Consolas, monospace;
|
font-family: Consolas, monospace;
|
||||||
|
align-self: center;
|
||||||
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<main>
|
<main>
|
||||||
<?php
|
<?php
|
||||||
|
/** Creational patterns **/
|
||||||
|
|
||||||
use Pattern\Creational\Singleton;
|
// require '../code/singleton.php';
|
||||||
|
require '../code/factory_method.php';
|
||||||
require '../vendor/autoload.php';
|
?>
|
||||||
require '../src/helpers.php';
|
</main>
|
||||||
|
<script>hljs.highlightAll()</script>
|
||||||
|
|
||||||
|
|
||||||
// Creational patterns
|
|
||||||
require '../code/singleton.php';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
|
||||||
</main>
|
|
||||||
<script>hljs.highlightAll();</script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
21
src/Pattern/Creational/FactoryMethod/CashPayment.php
Normal file
21
src/Pattern/Creational/FactoryMethod/CashPayment.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 12:52
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class CashPayment implements PaymentInterface
|
||||||
|
{
|
||||||
|
public function pay(Order $order): void
|
||||||
|
{
|
||||||
|
/** @noinspection ForgottenDebugOutputInspection */
|
||||||
|
dump("Cash payment success, amount: {$order->getSum()} ₴");
|
||||||
|
}
|
||||||
|
}
|
20
src/Pattern/Creational/FactoryMethod/CashPaymentFactory.php
Normal file
20
src/Pattern/Creational/FactoryMethod/CashPaymentFactory.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 17:55
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class CashPaymentFactory implements PaymentFactoryInterface
|
||||||
|
{
|
||||||
|
public static function createPayment(): PaymentInterface
|
||||||
|
{
|
||||||
|
return new CashPayment();
|
||||||
|
}
|
||||||
|
}
|
21
src/Pattern/Creational/FactoryMethod/IngPayment.php
Normal file
21
src/Pattern/Creational/FactoryMethod/IngPayment.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 19:22
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class IngPayment implements PaymentInterface
|
||||||
|
{
|
||||||
|
public function pay(Order $order): void
|
||||||
|
{
|
||||||
|
/** @noinspection ForgottenDebugOutputInspection */
|
||||||
|
dump("ING Bank payment success, amount: {$order->getSum()} ₴");
|
||||||
|
}
|
||||||
|
}
|
20
src/Pattern/Creational/FactoryMethod/IngPaymentFactory.php
Normal file
20
src/Pattern/Creational/FactoryMethod/IngPaymentFactory.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 18:01
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class IngPaymentFactory implements PaymentFactoryInterface
|
||||||
|
{
|
||||||
|
public static function createPayment(): PaymentInterface
|
||||||
|
{
|
||||||
|
return new IngPayment();
|
||||||
|
}
|
||||||
|
}
|
22
src/Pattern/Creational/FactoryMethod/Order.php
Normal file
22
src/Pattern/Creational/FactoryMethod/Order.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 12:08
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
final readonly class Order
|
||||||
|
{
|
||||||
|
public function __construct(private float $sum) {}
|
||||||
|
|
||||||
|
public function getSum(): float
|
||||||
|
{
|
||||||
|
return $this->sum;
|
||||||
|
}
|
||||||
|
}
|
21
src/Pattern/Creational/FactoryMethod/OtpPayment.php
Normal file
21
src/Pattern/Creational/FactoryMethod/OtpPayment.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 19:21
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class OtpPayment implements PaymentInterface
|
||||||
|
{
|
||||||
|
public function pay(Order $order): void
|
||||||
|
{
|
||||||
|
/** @noinspection ForgottenDebugOutputInspection */
|
||||||
|
dump("Otp Bank payment success, amount: {$order->getSum()} ₴");
|
||||||
|
}
|
||||||
|
}
|
20
src/Pattern/Creational/FactoryMethod/OtpPaymentFactory.php
Normal file
20
src/Pattern/Creational/FactoryMethod/OtpPaymentFactory.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 18:02
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class OtpPaymentFactory implements PaymentFactoryInterface
|
||||||
|
{
|
||||||
|
public static function createPayment(): PaymentInterface
|
||||||
|
{
|
||||||
|
return new OtpPayment();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 14:17
|
||||||
|
*/
|
||||||
|
|
||||||
|
//phpcs:ignore
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
interface PaymentFactoryInterface
|
||||||
|
{
|
||||||
|
public static function createPayment(): PaymentInterface;
|
||||||
|
}
|
34
src/Pattern/Creational/FactoryMethod/PaymentHelper.php
Normal file
34
src/Pattern/Creational/FactoryMethod/PaymentHelper.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 18:04
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
use RuntimeException;
|
||||||
|
|
||||||
|
class PaymentHelper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param string $paymentType
|
||||||
|
*
|
||||||
|
* @return PaymentFactoryInterface
|
||||||
|
*/
|
||||||
|
public static function getPaymentFactory(string $paymentType): PaymentFactoryInterface
|
||||||
|
{
|
||||||
|
return match ($paymentType) {
|
||||||
|
'privat' => new PrivatPaymentFactory(),
|
||||||
|
'raiffeisen' => new RaiffeisenPaymentFactory(),
|
||||||
|
'ing' => new IngPaymentFactory(),
|
||||||
|
'otp' => new OtpPaymentFactory(),
|
||||||
|
'cash' => new CashPaymentFactory(),
|
||||||
|
default => throw new RuntimeException("Payment type '{$paymentType}' is unknown")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
17
src/Pattern/Creational/FactoryMethod/PaymentInterface.php
Normal file
17
src/Pattern/Creational/FactoryMethod/PaymentInterface.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 16:57
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
interface PaymentInterface
|
||||||
|
{
|
||||||
|
public function pay(Order $order): void;
|
||||||
|
}
|
21
src/Pattern/Creational/FactoryMethod/PrivatPayment.php
Normal file
21
src/Pattern/Creational/FactoryMethod/PrivatPayment.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 19:18
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class PrivatPayment implements PaymentInterface
|
||||||
|
{
|
||||||
|
public function pay(Order $order): void
|
||||||
|
{
|
||||||
|
/** @noinspection ForgottenDebugOutputInspection */
|
||||||
|
dump("Privatbank payment success, amount: {$order->getSum()} ₴");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 17:57
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class PrivatPaymentFactory implements PaymentFactoryInterface
|
||||||
|
{
|
||||||
|
public static function createPayment(): PaymentInterface
|
||||||
|
{
|
||||||
|
return new PrivatPayment();
|
||||||
|
}
|
||||||
|
}
|
21
src/Pattern/Creational/FactoryMethod/RaiffeisenPayment.php
Normal file
21
src/Pattern/Creational/FactoryMethod/RaiffeisenPayment.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 19:12
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class RaiffeisenPayment implements PaymentInterface
|
||||||
|
{
|
||||||
|
public function pay(Order $order): void
|
||||||
|
{
|
||||||
|
/** @noinspection ForgottenDebugOutputInspection */
|
||||||
|
dump("Raiffeisen Bank payment success, amount: {$order->getSum()} ₴");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package: patterns
|
||||||
|
* @author: Yevhen Odynets
|
||||||
|
* @date: 2025-07-03
|
||||||
|
* @time: 17:59
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace Pattern\Creational\FactoryMethod;
|
||||||
|
|
||||||
|
class RaiffeisenPaymentFactory implements PaymentFactoryInterface
|
||||||
|
{
|
||||||
|
public static function createPayment(): PaymentInterface
|
||||||
|
{
|
||||||
|
return new RaiffeisenPayment();
|
||||||
|
}
|
||||||
|
}
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types = 1);
|
declare(strict_types = 1);
|
||||||
|
|
||||||
namespace Contracts;
|
namespace Pattern\Creational\Singleton;
|
||||||
|
|
||||||
interface Loggable
|
interface Loggable
|
||||||
{
|
{
|
@ -12,10 +12,8 @@
|
|||||||
|
|
||||||
declare(strict_types = 1);
|
declare(strict_types = 1);
|
||||||
|
|
||||||
namespace Service;
|
namespace Pattern\Creational\Singleton;
|
||||||
|
|
||||||
use Contracts\Loggable;
|
|
||||||
use Psr\Log\LoggerInterface;
|
|
||||||
use RuntimeException;
|
use RuntimeException;
|
||||||
|
|
||||||
use function in_array;
|
use function in_array;
|
@ -9,10 +9,7 @@
|
|||||||
|
|
||||||
//phpcs:ignore
|
//phpcs:ignore
|
||||||
declare(strict_types = 1);
|
declare(strict_types = 1);
|
||||||
namespace Pattern\Creational\Sub;
|
namespace Pattern\Creational\Singleton;
|
||||||
|
|
||||||
use Contracts\SingleInterface;
|
|
||||||
use Pattern\Creational\Singleton;
|
|
||||||
|
|
||||||
class Single extends Singleton implements SingleInterface
|
class Single extends Singleton implements SingleInterface
|
||||||
{
|
{
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types = 1);
|
declare(strict_types = 1);
|
||||||
|
|
||||||
namespace Contracts;
|
namespace Pattern\Creational\Singleton;
|
||||||
|
|
||||||
interface SingleInterface
|
interface SingleInterface
|
||||||
{
|
{
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
declare(strict_types = 1);
|
declare(strict_types = 1);
|
||||||
|
|
||||||
namespace Pattern\Creational;
|
namespace Pattern\Creational\Singleton;
|
||||||
|
|
||||||
use RuntimeException;
|
use RuntimeException;
|
||||||
|
|
@ -34,3 +34,11 @@ function trace(): string
|
|||||||
|
|
||||||
return sprintf('%s@%s:%d', $traced['function'], $traced['file'], $traced['line']);
|
return sprintf('%s@%s:%d', $traced['function'], $traced['file'], $traced['line']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws \Random\RandomException
|
||||||
|
*/
|
||||||
|
function getFloatRange(): float
|
||||||
|
{
|
||||||
|
return (float)random_int(1000, 999999) / 100;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user