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

总结:

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

相关内容

热门资讯

安卓系统打电话断,探究原因与解... 你是不是也遇到过这种情况?手机屏幕上显示着联系人名字,手指轻轻一点,电话却怎么也打不出去。这可真是让...
安卓平板系统升级关闭,揭秘操作... 亲爱的安卓平板用户们,你们是不是也遇到了这样的烦恼:每次系统升级,都要忍受漫长的等待,甚至有时候升级...
安卓系统怎么修改密码,轻松掌握... 手机里的安卓系统密码忘记了?别急,让我来给你支个招,让你轻松修改密码,重获手机自由! 一、解锁密码的...
优酷对安卓系统要求,揭秘安卓系... 你有没有发现,最近优酷的视频越来越高清了?是不是觉得看视频的体验提升了不少?不过,你知道吗?想要享受...
安卓两个系统切换系统,畅享多系... 你有没有想过,你的安卓手机里竟然可以藏着两个完全不同的系统呢?没错,就是那种一个系统用来工作,另一个...
苹果跟安卓的系统区别 你有没有发现,手机的世界里,苹果和安卓就像是两个截然不同的星球?它们各有各的特色,各有各的粉丝,今天...
安卓系统360抢红包,安卓系统... 你有没有发现,现在不管是聚会还是日常,抢红包已经成了大家不可或缺的娱乐活动呢!而在这其中,安卓系统的...
安卓系统手机wifi连不上wi... 亲爱的手机控们,你是否也有过这样的烦恼:明明家里WiFi信号满格,可就是连不上手机?别急,今天就来帮...
16s安卓系统,创新与变革的科... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让无数安卓用户心动的16s安...
一加三安卓8.0系统,畅享智能... 你有没有听说最近手机圈里的一股新潮流?那就是一加三安卓8.0系统!这可不是什么小打小闹的更新,而是一...
查安卓系统文件管理,深度解析与... 你有没有想过,你的安卓手机里那些密密麻麻的文件,其实就像一个隐藏的宝藏库呢?今天,就让我带你一起探索...
好用的车机安卓系统,好用的车机... 你有没有发现,现在开车的时候,车机系统的重要性简直堪比手机里的操作系统呢!想象当你坐在驾驶座上,手握...
vivo是安卓系统还是ios系... 你有没有想过,手机里的那个小家伙,vivo,它到底是在安卓的海洋里遨游,还是在iOS的苹果园里悠闲地...
安卓手机连接到linux系统,... 你有没有想过,你的安卓手机竟然可以和Linux系统来个亲密接触呢?没错,就是那种让电脑世界都为之振奋...
wp系统可以装安卓软件,轻松体... 哇,你知道吗?现在wp系统也能装安卓软件啦!这可是个让人兴奋的消息,是不是感觉像打开了新世界的大门?...
导航linux系统和安卓系统哪... 你有没有想过,为什么你的手机、平板电脑或者智能手表上总是装着那个安卓系统?而你的车载导航、智能电视或...
安卓系统精简rom下载,轻松打... 你有没有想过,你的安卓手机其实可以更轻快、更流畅?没错,就是通过下载一个精简版的ROM系统!今天,就...
安卓系统能查找手机吗,如何查找... 你有没有遇到过手机不见了,心里那个急啊!别担心,今天就来跟你聊聊安卓系统里那个神奇的查找手机功能,让...
安卓系统的选词搜索,智能选词搜... 你有没有发现,在使用安卓手机的时候,有时候想找某个词,却怎么也找不到?别急,今天就来聊聊安卓系统的选...
悦联系统安卓大屏,引领智能交互... 你有没有发现,最近手机屏幕越来越大,仿佛整个世界都缩小到了掌心之间?这不,今天就来聊聊一个特别有意思...