PHP 工厂方法模式

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

猜你喜欢

转载自my.oschina.net/u/3529405/blog/1823389