一、单例模式
导入时单例,使用时单例,觉得可以类比惰性求值和及早求值
- 导入时单例,直接实例类,其他地方使用实例。缺点需要导入时实例化,耗费时间和资源
class AAA: pass aaa = AAA() import aaa
- 使用时单例
# 单例 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")