1. PHP 工厂方法模式
<?php
/**
* 工厂方法模式
* 实现
* 通过一个抽象的核心工厂类指定方法.
* 具体工厂类实现抽象工厂类方法.
* 创建一个商品接口
* 商品具体类实现接口
*/
/**
* 定义商品接口
* Interface GoodsIO
*/
interface GoodsIO {
public function GoodsName ();
public function GoodsPrice ();
}
/**
* Class MacBook
* 具体商品类
* 集成GoodsIO接口并实现
*/
class MacBook implements GoodsIO {
public function GoodsName()
{
echo 'MacBook';
// TODO: Implement GoodsName() method.
}
public function GoodsPrice()
{
echo 'Price: 8888Rmb';
// TODO: Implement GoodsPrice() method.
}
}
/**
* Class Xps
* 具体商品类
* 集成GoodsIO接口并实现
*/
class Xps implements GoodsIO {
public function GoodsName()
{
echo'New Xps13';
// TODO: Implement GoodsName() method.
}
public function GoodsPrice()
{
echo 'Price: 69000Rmb';
// TODO: Implement GoodsPrice() method.
}
}
/**
* Class AFactory
* 定义一个抽象工厂
*/
abstract class AFactory {
abstract static function GetGoods();
public function AFError ($message) {
throw new Exception($message);
}
}
/**
* Class MacBookFactory
* 具体工厂集成抽象工厂 继承(AFactory)
* 抽象工厂的具体实现
*/
class MacBookFactory extends AFactory {
static function GetGoods()
{
return new MacBook();
// TODO: Implement GetGoods() method.
}
}
/**
* Class XpsFactory
* 具体工厂集成抽象工厂 继承(AFactory)
* 抽象工厂的具体实现
*/
class XpsFactory extends AFactory {
static function GetGoods()
{
return new Xps();
// TODO: Implement GetGoods() method.
}
// 使用抽象父类实现过的异常方法
public function XpsAFErr ($message) {
parent::AFError($message);
}
}
$xpsfa = new XpsFactory();
try {
$xpsfa->XpsAFErr('absError');
} catch (\Exception $e) {
// 使用抽象父类实现过的异常方法
echo $e->getMessage().PHP_EOL; // echo absError
}
// 使用工厂类
$xps = XpsFactory::GetGoods();
echo $xps->GoodsName().PHP_EOL.$xps->GoodsPrice();
// echo New Xps13Price: 69000Rmb
$mac = MacBookFactory::GetGoods();
echo $mac->GoodsName().PHP_EOL.$mac->GoodsPrice();
// echo MacBookPrice: 8888Rmb