工厂方法模式

一、内容

不直接向客户端暴露对象创建的实现细节,定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类

二、角色

  • 抽象工厂角色(Factory)
  • 具体工厂角色(Concrete Factory)
  • 抽象产品角色(Product)
  • 具体产品角色(Concrete Product)

三、优点

  • 隐藏了对象创建的实现细节
  • 工厂类可以不知道它所创建的对象的类
  • 每个具体的产品都对应了一个具体的工厂,不需要修改工厂类代码

四、缺点

  • 每增加一个具体产品类,就必须增加一个相应的具体工厂类

五、适用场景

  • 需要生产多种、大量复杂对象的时候
  • 需要降低耦合度的时候
  • 当系统中的产品种类需要经常扩展的时候

六、实例

#!/usr/bin/env python
# -*- coding: utf8 -*-
# __Author: "Skiler Hao"
# date: 2017/6/2 15:45
from abc import ABCMeta, abstractmethod


class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass


class AliPay(Payment):
    def __init__(self,enabled_yue=False):
        self.enabled_yue = enabled_yue

    def pay(self, money):
        if self.enabled_yue:
            print("支付宝余额支付%s元" % money)
        else:
            print("支付宝支付%s元" % money)


class ApplePay(Payment):
    def pay(self, money):
        print("苹果支付支付%s元" % money)


class WechatPay(Payment):
    def pay(self, money):
        print("微信支付支付%s元" % money)


class PaymentFactory(metaclass=ABCMeta):
    @abstractmethod
    def create_payment(self):
        pass


class AlipayFactory(PaymentFactory):
    def create_payment(self):
        return AliPay()


class AppleFactory(PaymentFactory):
    def create_payment(self):
        return ApplePay()


class WechatFactory(PaymentFactory):
    def create_payment(self):
        return WechatPay()
f = AlipayFactory()
p = f.create_payment()
p.pay(100)
工厂方法模式样例

七、UML图

原文地址:https://www.cnblogs.com/skiler/p/6935045.html