当前位置: 首页 > news >正文

工厂模式与抽象工厂

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

示例:

# 简单工厂
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
]

总结:

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

相关文章:

  • 什么?你不知道 ConcurrentHashMap 的 kv 不能为 null?
  • SQL复习04 | 复杂查询
  • 【面试题】Java面试题汇总(无解答)
  • C++---背包模型---收服精灵(每日一道算法2023.3.11)
  • day30_JS
  • 【Java学习笔记】19.Java 正则表达式(2)
  • 华为云arm架构轻松安装kubeedge
  • 33--Vue-前端开发-使用Vue脚手架快速搭建项目
  • TMS WEB Core开发Web应用优势说明
  • 人工智能简单应用1-OCR分栏识别:两栏识别三栏识别都可以,本地部署完美拼接
  • Gin框架路由拆分与注册详解析
  • 2020蓝桥杯真题凯撒加密 C语言/C++
  • taro+vue3小程序使用v-html渲染的内容为class写了样式无效
  • MASK-RCNN网络介绍
  • 导航技术调研(CSDN_0023_20221217)
  • 买卖股票的最佳时机 I II III IV
  • STM32—LCD1602
  • 英雄算法学习路线
  • 【设计模式】备忘录模式和迭代器模式
  • rapidcsv 写csv文件实例
  • 数据库--进阶篇--9--存储引擎
  • 物品的管理的隐私政策
  • 深度解析首个Layer3 链 Nautilus Chain,有何优势?
  • 配对变量t检验
  • 蓝桥杯三月刷题 第八天
  • EXCEL技能点3-常用技能1
  • 经典分类模型回顾16-AlexNet实现垃圾分类(Tensorflow2.0版)
  • vue3使用vuex
  • Java面向对象:抽象类的学习
  • modbus转profinet网关连接5台台达ME300变频器案例