通过简单工厂模式实现多种支付理解抽象类和接口

类是描述一个实体的,实体则包含属性和该属性可以实现的动作,所以抽象类可以包含属性和方法。

接口是描述行为的,所以接口仅可以定义方法,不可以定义属性,但可以定义常量。

 

举例说明实现支付,支付可以有很多种方式:微信、支付宝、京东白条等。他们都至少有一个支付行为,所以首先定义一个支付接口。

<?php

interface PayInterface
{
    //支付行为
    public function pay();
}

它们都含有一些公有属性,比如支付时间、支付金额,流水号,以及设置和获得这些属性的方法。所以首先应该定义一个抽象类。

<?php

abstract class AbstractPay
{
    private $pay_time;
    private $amount;
    private $serial_num;

    abstract public function pay();

    public function setPayTime($time)
    {
        $this->pay_time = $time;
    }

    public function setAmount($amount)
    {
        $this->amount = $amount;
    }

    public function setSerial($serial_num)
    {
        $this->serial_num = $serial_num;
    }

    public function getPayTime()
    {
        return $this->pay_time;
    }

    public function getAmount()
    {
        return $this->amount;
    }

    public function getSerial()
    {
        return $this->serial_num;
    }
}

此时,三种支付方式分别单独定义一个类,继承抽象类、实现接口。(剩下需要的功能可以在里边自己定义)

<?php
include './PayInterface.php';
include './AbstractPay.php';

class WxPay extends AbstractPay implements PayInterface
{
    public function pay()
    {
        echo 'This is wx pay method';
    }
}
<?php
include './PayInterface.php';
include './AbstractPay.php';

class AliPay extends AbstractPay implements PayInterface
{
    public function pay()
    {
        echo 'This is ali pay method';
    }
}
<?php
include './PayInterface.php';
include './AbstractPay.php';

class JdPay extends AbstractPay implements PayInterface
{
    public function pay()
    {
        echo 'This is jd pay method';
    }
}

还需要定义一个工厂类,用静态方法根据参数实例化相应的支付类。

<?php

class PayFactory
{
    static public function getPayMethod($method)
    {
        $class_name = ucfirst($method . 'Pay');
        include ($class_name . '.php');

        return new $class_name();
    }
}

下面进行测试:

<?php
include_once ('./PayFactory.php');

$wx_obj = PayFactory::getPayMethod('wx');

echo $wx_obj->pay();
echo "\n";
echo $wx_obj->setPayTime(date('Ymd H:i:s', time()));
echo $wx_obj->setAmount('99.9');
echo $wx_obj->setSerial('AX3J6S8HYL');
echo $wx_obj->getPayTime();
echo "\n";
echo $wx_obj->getAmount();
echo "\n";
echo $wx_obj->getSerial();
echo "\n";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AirGo.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值