工厂模式与抽象工厂
创始人
2024-06-01 17:51:26
0

原理:逻辑和业务全部封装 不需要细节 只要结果

示例:

# 简单工厂
class SimpleFactory:# 产品@staticmethoddef product(name):return nameif __name__ == "__main__":product = SimpleFactory.product("Gitee")print(product)
  • 装饰器@staticmethod,普通方法,类对象实例对象都可应用
  • 装饰的方法类比产品,工厂生产产品,只要最后结果

 抽象工厂实例:

from abc import ABCMeta, abstractmethod  # 抽象工厂class TestMeta(metaclass=ABCMeta):  继承metaclass=ABCMetadef __init__(self):self.a = 1@abstractmethoddef fun(self):passclass TestOne(TestMeta):def __init__(self):super().__init__()  # 调用父类的init# TestMeta.__init__()self.b = 1# 重写抽象方法def fun(self):print("拼接三方登录的url")
  • 抽象工厂类似于生活中的橘子,橘子的种类繁多,但橘子本体的一些口感(方法)是其他种类必须所拥有的,也就是其他类继承抽象工厂类,必须重写已有的方法,否则报错
  • pass是占位符,抽象工厂中的方法要用装饰器@abstractmethod定义,只定义框架,不写具体逻辑

抽象工厂完成第三方登录基本方法:

class LoginProvide(metaclass=ABCMeta):# 跳转拼接@abstractmethoddef get_url(self):pass# 获取token@abstractmethodasync def get_token(self, code):pass# 获取用户信息@abstractmethodasync def get_info(self, token):pass# 用户信息存储@abstractmethodasync def set_user(self, user):pass

 gitee登录实例

class GiteeProvider(LoginProvide):def __repr__(self):return "Gitee登录"def get_url(self):url = SITE_TYPE["Gitee"]["url"]  # 跳到授权地址return urlasync def get_token(self, code):# 通过授权码请求token# 异步发送网络请求,防止阻塞client_id = SITE_TYPE["Gitee"]["client_id"]client_secret = SITE_TYPE["Gitee"]["client_secret"]redirect_uri = SITE_TYPE["Gitee"]["redirect_uri"]async with httpx.AsyncClient() as client:res = await client.post(url=f"https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}",timeout=20)res = res.json()# 获取gitee的access_token refresh_tokenreturn res["access_token"]async def get_info(self, token):async with httpx.AsyncClient() as client:res = await client.get(SITE_TYPE["Gitee"]["gitee_get_info_uri"] + token, timeout=20)res = res.json()user = {"gitee_id": res["id"],"gitee_username": res["name"]}return userasync def set_user(self, user):gitee_id = user["gitee_id"]gitee_username = user["gitee_username"]username = (str(gitee_id) + "_" + str(gitee_username))try:# 曾经使用过gitee账号await db.get(UserModel.select().where((UserModel.username == username)& (UserModel.site_type == SITE_TYPE["Gitee"]["num"])))except Exception as e:print(e.args)await db.create(UserModel,username=username,site_type=SITE_TYPE["Gitee"]["num"])finally:mj = MyJwt()# 生成带有生命周期的tokentoken = mj.encode_date({"username": username,"site_type": SITE_TYPE["Gitee"]["num"]})# 生成refresh_token  redis里面存refresh_token = await mj.set_refresh_token(f"{gitee_id}_{gitee_username}")# 中间缓存页url = SITE_TYPE["Gitee"]["gitee_center_uri"] + f"?gitee_refresh_token={refresh_token}&gitee_token={token}&username={username}"return url

Gitee简化版:

# gitee登录简化版
class GiteeFactory(BaseHandler):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.gitee = GiteeProvider()async def get(self):code = self.get_argument("code")access_token = await self.gitee.get_token(code)user = await self.gitee.get_info(access_token)url = await self.gitee.set_user(user)return self.redirect(url)# 路由
urlpatterns = [(r"/gitee_back/", GiteeFactory),  # gitee
]

总结:

  • 利用抽象工厂模式,来编写架子,方便区分步骤,简洁明了
  • 继承抽象工厂必须要重写所有方法
  • 养成良好的代码习惯,方便给客户调用,保护内部细节

相关内容

热门资讯

ios系统与安卓互通吗 你有没有想过,为什么你的iPhone手机上的游戏,你的安卓手机上的好友也能玩?或者,你用安卓手机下载...
中国法律app安卓系统,便捷法... 你有没有发现,现在手机上各种各样的应用层出不穷,而在中国,法律相关的APP更是让人眼花缭乱。今天,就...
安卓系统漫画神器怎么用 你有没有发现,手机里装了那么多应用,有时候就是缺那么一个能让你轻松看漫画的神器?别急,今天就来给你揭...
哪个公司推出的安卓系统,引领移... 你有没有想过,我们每天离不开的安卓系统,究竟是由哪个公司推出的呢?没错,就是那个家喻户晓的谷歌(Go...
xp系统的电脑刷个安卓系统,电... 你有没有想过,你的老XP系统电脑,是不是也能来个华丽变身,摇身一变成为安卓系统的忠实粉丝呢?没错,今...
特斯拉安卓系统怎么样,创新科技... 特斯拉安卓系统怎么样?揭秘这款独特系统的魅力与挑战想象一辆汽车,它不仅是一台交通工具,更是一个移动的...
电视安卓系统区别相机,解析电视... 你有没有发现,家里的电视和手机,还有相机,它们都离不开一个神奇的东西——系统!今天,咱们就来聊聊这三...
安卓电脑系统哪个系统最好用,探... 你有没有想过,如果你的电脑也能像手机一样灵活多变,那该多好啊!想象你可以在电脑上玩手游,看视频,还能...
安卓系统高低影响价格吗,系统高... 你有没有想过,同样是手机,为什么有的便宜有的贵呢?这其中,安卓系统的版本可是起着不小的作用哦!今天,...
冠道支持安卓系统么,冠道安卓系... 你有没有想过,你的爱车冠道是不是也能跟上时代的潮流,支持安卓系统呢?这可是个让人心动的话题哦!今天,...
安卓和系统不兼容,揭秘不兼容问... 你有没有遇到过这种情况?手机里下载了一个超级酷炫的应用,结果一打开,哎呀妈呀,系统不兼容,直接闪退了...
安卓平板刷linux系统版本,... 你有没有想过给你的安卓平板来个“变身”大法?没错,就是刷上Linux系统版本!想象原本流畅的安卓系统...
安卓系统不支持网络,探索网络限... 你知道吗?最近我在网上看到一个让人哭笑不得的新闻,说的是安卓系统竟然不支持网络!这可真是让人大跌眼镜...
红魔系统属于安卓系统吗,安卓游... 你有没有听说过红魔系统?是不是好奇它到底是不是安卓系统的一员呢?今天,就让我带你一探究竟,揭开红魔系...
xos系统是安卓吗,揭秘其与安... 你有没有听说过XOS系统?是不是好奇它是不是安卓系统呢?今天,就让我带你一探究竟,揭开这个神秘面纱!...
whatsup安卓系统下载,便... Hey,亲爱的手机控们,是不是又到了你心痒痒想要升级手机系统的时候了?今天,咱们就来聊聊那让人心动的...
安卓点餐系统自己做,重塑餐饮服... 你有没有想过,自己动手打造一个安卓点餐系统呢?想象点餐时不再需要繁琐的操作,一键就能完成,是不是很酷...
安卓安装系统验证失败,原因排查... 最近是不是你也遇到了安卓安装系统验证失败的问题?别急,让我来给你详细说说这个让人头疼的小麻烦,让你一...
三方开源安卓系统,基于三方开源... 你知道吗?在安卓的世界里,除了谷歌的官方系统,还有许多其他有趣的版本在悄悄崛起。今天,就让我带你一起...
安卓系统最老版本下载 你有没有想过,手机里的安卓系统其实也有它的“老古董”呢?没错,就是那些最古老的安卓版本,它们就像时间...