zoukankan      html  css  js  c++  java
  • 工厂方法模式

    一、内容

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

    二、角色

    • 抽象工厂角色(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图

  • 相关阅读:
    regex
    ubuntu 14.04 更新 gcc/g++ 4.9.2
    然而我又更新博客了。
    我一万年也不更新一次博客
    区块链
    mongodb查看数据库和表的信息
    js高级总结
    es6 新特性
    Flex 布局教程:实例篇
    常用 Git 命令清单
  • 原文地址:https://www.cnblogs.com/skiler/p/6935045.html
Copyright © 2011-2022 走看看