MrZyb Always in fear of one's own ignorance
  • 工厂模式

    • 工厂模式是另一种非常常用的模式,正如他的名字所描述的,是对象实例的生产工厂。工厂模式提供了通用的方法有助于我们去获取对象,而不需要关心其具体的内在的实现。
  • 工厂模式我的理解他分为三种情况:

    • 简单工厂
    • 工厂方法(静态工厂)
    • 抽象工厂
  • 简单工厂的实现,实现一个支付工厂,可以通过这个工厂来实现获取需要的支付实例

image

class WechatPay {
    public function makeWechaPay($amount) {
        echo "wechat pay ¥{$amount}" . PHP_EOL;
    }
}

class PayFactory {
    public function createWechatPay() {
        return new WechatPay();
    }
}

$payFactory = new PayFactory();
$wechaPay = $payFactory->createWechatPay();
$wechaPay->makeWechaPay('10');
  • 工厂方法的实现
    • 现实中会存在有多种支付方式的存在,我们可以把通用的方法抽象出来,然后让大家按照约定来实现这个方法。这样的话抽象工厂的使用者不需要关心对象的创建过程,他们只需要知道这些对象是通过哪些约定好的方法来工作的。

image

abstract class PayCenter {
    abstract public function pay($amount);
}

class WechatPay extends PayCenter {
    public function pay($amount) {
        echo "wechat pay ¥{$amount}" . PHP_EOL;
    }
}

class AliPay extends PayCenter {
    public function pay($amount) {
        echo "ali pay ¥{$amount}" . PHP_EOL;
    }
}

class PayFactory {
    public function createWechatPay() {
        return new WechatPay();
    }

    public function createAliPay() {
        return new AliPay();
    }
}

$payFactory = new PayFactory();
$aliPay = $payFactory->createAliPay();
$aliPay->pay('10');
$wechatPay = $payFactory->createWechatPay();
$wechatPay->pay('10');

这个时候我们就只要知道不管是哪种支付,他都是通过 pay 这个动作来实现的,但是我们还是要记住这些支付方式有哪些,并且新增支付方式时需要到工厂中添加获取对应的支付对象的方法,通过 静态工厂 可以减少这个步骤。

  • 静态工厂
    • 和工厂方法模式不同的是静态工厂模式只用一个静态方法就解决了所有类型的对象创建,通常被命名为工厂 或者 构建器,本质上和工厂方法是一样的。
......
final class StaticFactory
{
    public static function factory($payStyle)
    {
        return new $payStyle;
    }
}

$pay = StaticFactory::factory('WechatPay');
$pay->pay('10');
$pay = StaticFactory::factory('AliPay');
$pay->pay('10');
  • 抽象工厂

    • 与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
  • 以商店为例子

image

// 商店模型
abstract class shopAbstarctFactory
{
    abstract public function payCenter($payStyle);
    abstract public function orderCenter($sell);
}
// 饭店
class RestaurantShop extends shopAbstarctFactory {
    public function payCenter($payStyle) {
        return StaticPayFactory::payFactory($payStyle);
    }

    public function orderCenter($foods) {
        return StaticOrderFactory::orderFactory($foods);
    }
}
// 书店
class BookShop extends shopAbstarctFactory {
    public function payCenter($payStyle) {
        return StaticPayFactory::payFactory($payStyle);
    }

    public function orderCenter($books) {
        return StaticOrderFactory::orderFactory($books);
    }
}
// 通用支付中心
abstract class PayCenter {
    abstract public function pay($amount);
}

class WechatPay extends PayCenter {
    public function pay($amount) {
        echo "wechat pay ¥{$amount}" . PHP_EOL;
    }
}

class AliPay extends PayCenter {
    public function pay($amount) {
        echo "ali pay ¥{$amount}" . PHP_EOL;
    }
}

final class StaticPayFactory {
    public static function payFactory($payStyle)
    {
        return new $payStyle;
    }
}
// 通用订单中心
abstract class OrderCenter {
    abstract public function makeOrder();
}

class book extends OrderCenter {
    public function makeOrder() {
        echo "create a book order" . PHP_EOL;
    }
}

class food extends OrderCenter {
    public function makeOrder() {
        echo "create a food order" . PHP_EOL;
    }
}

final class StaticOrderFactory {
    public static function orderFactory($order)
    {
        return new $order;
    }
}

// 买一本书
$bookShop = new BookShop();
$orderCenter = $bookShop->orderCenter('book');
$orderCenter->makeOrder();
$payCenter = $bookShop->payCenter('AliPay');
$payCenter->pay(10);
// 吃个饭
$restaurantShop = new RestaurantShop();
$orderCenter = $restaurantShop->orderCenter('food');
$orderCenter->makeOrder();
$payCenter = $restaurantShop->payCenter('WechatPay');
$payCenter->pay(100);
0.003271s