设计模式学习

清华大学出版社-图书详情-《设计模式的艺术》 (tsinghua.edu.cn)

 一、单例模式

导入时单例,使用时单例,觉得可以类比惰性求值和及早求值

  1. 导入时单例,直接实例类,其他地方使用实例。缺点需要导入时实例化,耗费时间和资源
    class AAA:
        pass
    
    aaa = AAA()
    
    
    import aaa
  2.  使用时单例
    # 单例
    class Singleton(type):
        """
        单例模式
        """
    
        _instances = {}
    
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
            return cls._instances[cls]
    
    
    class AAA(metaclass=Singleton):
        pass
    
    
    """ 抽象基类
    class AAA(abc.ABC):
        pass
    """

    元类Singleton控制,AAA类实例化。缺点多线程场景可能存在问题

二、工厂模式

三、策略模式

"""策略模式
需求:用户完成一定任务,即可获得美团外卖、酒旅和美食等多种品类券。设计一套奖励发放机制
"""
import abc


class StrategyContext:
    """策略上下文
    不同策略自注册
    """
    register_map = {}

    @classmethod
    def register_strategy(cls, name, obj):
        cls.register_map.setdefault(name, obj)

    @classmethod
    def get_strategy(cls, param):
        obj = cls.register_map.get(param, "")
        if not obj:
            raise
        return obj


class Strategy(abc.ABC):
    @abc.abstractmethod
    def issue(self):
        pass

    def register(self):
        StrategyContext.register_strategy(self.__class__.__name__, self)


class Food(Strategy):
    """美食策略"""
    def issue(self):
        print("返回美食优惠券")


class WaiMai(Strategy):
    """外卖策略"""
    def issue(self):
        print("返回外卖优惠券")


class Hotel(Strategy):
    """酒店策略"""
    def issue(self):
        print("返回酒店优惠券")


class RewardService:
    @staticmethod
    def issue_reward(param):
        strategy: Strategy = StrategyContext.get_strategy(param)
        strategy.issue()


if __name__ == '__main__':
    Food().register()
    WaiMai().register()
    Hotel().register()
    RewardService.issue_reward("Food")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值