mirror of
https://github.com/DesignPatternsPHP/DesignPatternsPHP.git
synced 2025-08-01 20:50:15 +02:00
cs StaticFactory
This commit is contained in:
143
State/State.php
Normal file
143
State/State.php
Normal file
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
namespace DesignPatterns\Status;
|
||||
|
||||
/**
|
||||
* The order has two status: created, shipping, completed.
|
||||
* When the order's status is created, what can do is just 'shipping' handle;
|
||||
* When the order's status is shipping, what can do is just 'completed' handle;
|
||||
*
|
||||
*/
|
||||
interface OrderInterface
|
||||
{
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function shipOrder();
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function completeOrder();
|
||||
}
|
||||
|
||||
/**
|
||||
* Class CreateOrder
|
||||
*/
|
||||
class CreateOrder implements OrderInterface
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $order;
|
||||
|
||||
/**
|
||||
* @param array $order
|
||||
*/
|
||||
public function __construct(array $order)
|
||||
{
|
||||
if (empty($order)) {
|
||||
throw new \Exception('Order can not be empty!');
|
||||
}
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
public function shipOrder()
|
||||
{
|
||||
$this->order['status'] = 'shipping';
|
||||
$this->order['updatedTime'] = time();
|
||||
|
||||
// Setting the new order status into database;
|
||||
return $this->updateOrder($order);
|
||||
}
|
||||
|
||||
public function completeOrder()
|
||||
{
|
||||
//Can not complete the order which status is created, throw exception;
|
||||
throw new \Exception('Can not complete the order which status is created!');
|
||||
}
|
||||
}
|
||||
|
||||
class ShippingOrder implements OrderInterface
|
||||
{
|
||||
|
||||
private $order;
|
||||
|
||||
public function __construct(array $order)
|
||||
{
|
||||
if (empty($order)) {
|
||||
throw new \Exception('Order can not be empty!');
|
||||
}
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
public function shipOrder()
|
||||
{
|
||||
//Can not ship the order which status is shipping, throw exception;
|
||||
throw new \Exception('Can not ship the order which status is shipping!');
|
||||
}
|
||||
|
||||
public function completeOrder()
|
||||
{
|
||||
$this->order['status'] = 'completed';
|
||||
$this->order['updatedTime'] = time();
|
||||
|
||||
// Setting the new order status into database;
|
||||
return $this->updateOrder($order);
|
||||
}
|
||||
}
|
||||
|
||||
class OrderFactory
|
||||
{
|
||||
|
||||
private function __construct()
|
||||
{
|
||||
throw Exception('Can not instance the OrderFactory class!');
|
||||
}
|
||||
|
||||
public static function getOrder($id)
|
||||
{
|
||||
$order = 'Get Order From Database';
|
||||
|
||||
switch ($order['status']) {
|
||||
case 'created':
|
||||
return new CreateOrder($order);
|
||||
case 'shipping':
|
||||
return new ShippingOrder($order);
|
||||
default:
|
||||
throw new \Exception('Order status error!');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Client
|
||||
|
||||
class OrderController
|
||||
{
|
||||
/**
|
||||
* @param int $id
|
||||
*/
|
||||
public function shipAction($id)
|
||||
{
|
||||
$order = OrderFactory::getOrder($id);
|
||||
try {
|
||||
$order->shipOrder($id);
|
||||
} catch (Exception $e) {
|
||||
//handle error!
|
||||
}
|
||||
// response to browser
|
||||
}
|
||||
|
||||
public function completeAction($id)
|
||||
{
|
||||
$order = OrderFactory::getOrder($id);
|
||||
try {
|
||||
$order->completeOrder($id);
|
||||
} catch (Exception $e) {
|
||||
//handle error!
|
||||
}
|
||||
// response to browser
|
||||
}
|
||||
}
|
@@ -2,7 +2,10 @@
|
||||
|
||||
namespace DesignPatterns\StaticFactory;
|
||||
|
||||
class FormatNumber implements Formatter
|
||||
/**
|
||||
* Class FormatNumber
|
||||
*/
|
||||
class FormatNumber implements FormatterInterface
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
@@ -2,7 +2,10 @@
|
||||
|
||||
namespace DesignPatterns\StaticFactory;
|
||||
|
||||
class FormatString implements Formatter
|
||||
/**
|
||||
* Class FormatString
|
||||
*/
|
||||
class FormatString implements FormatterInterface
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
@@ -2,7 +2,10 @@
|
||||
|
||||
namespace DesignPatterns\StaticFactory;
|
||||
|
||||
interface Formatter
|
||||
/**
|
||||
* Class FormatterInterface
|
||||
*/
|
||||
interface FormatterInterface
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
@@ -14,16 +14,19 @@ namespace DesignPatterns\StaticFactory;
|
||||
* - Zend Framework: Zend_Cache_Backend or _Frontend use a factory method create cache backends or frontends
|
||||
*
|
||||
* Note1: Remember, static => global => evil
|
||||
* Note2: Cannot be subclassed or mock-uped or have multiple different instances
|
||||
* Note2: Cannot be subclassed or mock-upped or have multiple different instances
|
||||
*/
|
||||
class StaticFactory
|
||||
{
|
||||
|
||||
/**
|
||||
* the parametrized function to get create an instance
|
||||
*
|
||||
* @param string $type
|
||||
*
|
||||
* @static
|
||||
* @return Formatter
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
* @return FormatterInterface
|
||||
*/
|
||||
public static function factory($type)
|
||||
{
|
||||
@@ -35,5 +38,4 @@ class StaticFactory
|
||||
|
||||
return new $className();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -1,131 +0,0 @@
|
||||
<?php
|
||||
namespace DesignPatterns;
|
||||
|
||||
|
||||
/**
|
||||
* The order has two status: created, shipping, completed.
|
||||
* When the order's status is created, what can do is just 'shipping' handle;
|
||||
* When the order's status is shipping, what can do is just 'completed' handle;
|
||||
*
|
||||
*/
|
||||
interface OrderInterface
|
||||
{
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function shipOrder();
|
||||
|
||||
public function completeOrder();
|
||||
|
||||
}
|
||||
|
||||
class CreateOrder implements OrderInterface
|
||||
{
|
||||
|
||||
private $order;
|
||||
|
||||
public function __construct(array $order)
|
||||
{
|
||||
if (empty($order)) {
|
||||
throw new \Exception('Order can not be empty!');
|
||||
}
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
public function shipOrder()
|
||||
{
|
||||
$this->order['status'] = 'shipping';
|
||||
$this->order['updatedTime'] = time();
|
||||
// Setting the new order status into database;
|
||||
return $this->updateOrder($order);
|
||||
}
|
||||
|
||||
public function completeOrder()
|
||||
{
|
||||
//Can not complete the order which status is created, throw exception;
|
||||
throw new \Exception('Can not complete the order which status is created!');
|
||||
}
|
||||
}
|
||||
|
||||
class ShippingOrder implements OrderInterface
|
||||
{
|
||||
|
||||
private $order;
|
||||
|
||||
public function __construct(array $order)
|
||||
{
|
||||
if (empty($order)) {
|
||||
throw new \Exception('Order can not be empty!');
|
||||
}
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
public function shipOrder()
|
||||
{
|
||||
//Can not ship the order which status is shipping, throw exception;
|
||||
throw new \Exception('Can not ship the order which status is shipping!');
|
||||
}
|
||||
|
||||
public function completeOrder()
|
||||
{
|
||||
$this->order['status'] = 'completed';
|
||||
$this->order['updatedTime'] = time();
|
||||
// Setting the new order status into database;
|
||||
return $this->updateOrder($order);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class OrderFactory {
|
||||
|
||||
public static function getOrder($id)
|
||||
{
|
||||
$order = 'Get Order From Database';
|
||||
|
||||
switch ($order['status']) {
|
||||
case 'created':
|
||||
return new CreateOrder($order);
|
||||
case 'shipping':
|
||||
return new ShippingOrder($order);
|
||||
default:
|
||||
throw new \Exception('Order status error!');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private function __construct()
|
||||
{
|
||||
throw Exception('Can not instance the OrderFactory class!');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Client
|
||||
|
||||
class OrderController
|
||||
{
|
||||
/**
|
||||
* @param int $id
|
||||
*/
|
||||
public function shipAction($id)
|
||||
{
|
||||
$order = OrderFactory::getOrder($id);
|
||||
try {
|
||||
$order->shipOrder($id);
|
||||
} catch (Exception $e) {
|
||||
//handle error!
|
||||
}
|
||||
// response to browser
|
||||
}
|
||||
|
||||
public function completeAction($id)
|
||||
{
|
||||
$order = OrderFactory::getOrder($id);
|
||||
try {
|
||||
$order->completeOrder($id);
|
||||
} catch (Exception $e) {
|
||||
//handle error!
|
||||
}
|
||||
// response to browser
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user