工厂模式与抽象工厂
创始人
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
]

总结:

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

相关内容

热门资讯

雨林木风系统怎么用-探索神秘酷... 嘿,亲爱的数字探险家们,今天咱们聊聊那个神秘又酷炫的“雨林木风系统”!这玩意儿,听起来就像是电影《侏...
朝阳医院电话预约体验:过程曲折... 说到朝阳医院的电话预约,我这心里可真是五味杂陈啊!每次想要预约个专家号,那电话打得我手指都快断了,听...
rtk测量仪器工作原理-RTK... 大家好呀!今天我要带大家一起走进一个超级炫酷的世界——RTK测量仪器的工作原理!这可不是一般的仪器哦...
linux桌面环境比较-眼花缭... 大家好!今天咱们就来聊聊那些让人眼花缭乱的Linux桌面环境。我得说,选择一个合适的桌面环境,简直就...
老年人肺气肿感染-年迈肺气肿患... 在这个世界上,每个生命都在用自己的方式呼吸着。但对于我,一个年迈的肺气肿患者而言,每一次呼吸都像是在...
克罗恩打类克能治愈吗-克罗恩病... 大家好,我是一个深受克罗恩病折磨的患者。每当肚子里的痛楚如潮水般涌来,我都会问自己,这种痛苦真的有尽...
帝国cms72商城模板-帝国 ... 大家好,我是小杰,一个对网页设计充满激情的小伙子。今天,我要和大家聊聊我最近疯狂迷恋的帝国CMS72...
bootps-Bootps:连... 哎呀,说到Bootps,这可不是什么高大上的技术术语,它其实是网络启动协议的一种,但今天我不是来给你...
微软正版下载:支持创新,选择正... 嘿,大家好!今天咱们聊聊“微软正版下载”这个话题。说到微软,你可能立马想到那些高大上的软件,像是Of...
mapinfo 加载在线地图-... 哎呀,今天说说我在用MapInfo加载在线地图时的心情吧,那真是一场接着一场的惊喜和失望交替上演的戏...
海尔阿里四代电视:智能终端、超... 嘿,朋友们,你们有没有想过,家里那台老电视还能有多大的变化?让我告诉你们,海尔阿里四代电视,简直是家...
breeze什么牌子-Bree... 哎呀,说到Breeze这个牌子,我的心就忍不住跳跃起来!这可不是什么普通的小品牌,它简直就是夏日的代...
ubuntu 1404关闭3d... 哎呀,说到Ubuntu14.04关闭3D这个事儿,我的心啊,就像是被冰冷的代码给冻住了。你知道的,U...
龙腾数据恢复注册码-电脑崩溃重... 哎呀,天哪!我的电脑突然崩溃了,所有的重要文件都打不开了!我现在就像热锅上的蚂蚁,急得团团转。听说有...
克罗恩治疗方法-与克罗恩病斗争... 大家好,我是一个与克罗恩病斗争多年的患者。今天,我想和大家聊聊克罗恩病的治疗方法,虽然这个话题听起来...
迅龙硬盘数据恢复:拯救误删文件... 哎呀,说到这个迅龙硬盘数据恢复,我的心就扑通扑通跳个不停!你知道吗,有天我一不小心,把硬盘里的那些宝...
手机绿云如何夜审-手机里的绿云... 手机成了我们形影不离的伙伴,但你知道吗?当夜深人静,月色如水,手机里的绿云,就像夜行的幽灵,悄无声息...
朝阳医院西院体检中心:体验温馨... 嘿,朋友们,今天我要给你们讲讲我在朝阳医院西院体检中心的那点小确幸。你知道的,体检这事儿,说起来总是...
win10百度贴吧-Win10... 哎呀,说到在Win10上用百度贴吧,我这心情就五味杂陈啊!首先得说,Win10系统确实挺酷炫的,界面...
libeay32.dll修复工... 哎呀,说到这个libeay32.dll文件,真是让人头疼得不行!你是不是也遇到过打开某个软件或者游戏...