惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
J
Java Code Geeks
U
Unit 42
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
D
Docker
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
I
InfoQ
The Cloudflare Blog
小众软件
小众软件
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
V
V2EX
月光博客
月光博客
Martin Fowler
Martin Fowler

ccagml

使用valgrind观察luajit进程内存 - ccagml 从生产环境报错学习protobuf编码规则 - ccagml 拨开迷雾,探寻深夜游戏集群启动失败真相 - ccagml 从技能状态图标显示错误到给 LuaJIT 报告bug - ccagml 游戏系统MySQl执行超时问题排查 - ccagml lua中pairs和ipairs都做了什么操作 - ccagml lua中#号是怎么计算字符串长度的 - ccagml lua中#号是怎么计算长度的 - ccagml lua中tonumber做了什么 - ccagml
跟着vscode插件学设计模式-工厂模式 - ccagml
2022-11-20 · via ccagml

项目地址

项目背景

leetcode_extension项目是一个Visual Studio Code插件,在插件市场也有发布

工厂模式相关概念

  • 创建型模式
  • 主要解决:解决接口选择问题
  • 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
  • 优点:
    1. 根据字符串名称创建对象
    2. 扩展性高,如果想增加一个子类功能,只要扩展一个工厂类就可以。
    3. 屏蔽产品的具体实现,调用者只关心可使用的接口。
  • 缺点:
    1. 每增加一个功能,都需要改动增加一个具体的子类和对象实现工厂。
    2. 类的数量变多,复杂度上升,系统对具体类的依赖

项目中的代码

  1. 调用入口
    • src/rpc/childMain.ts
          let curApi: IApi | undefined = apiFactory.getApi(com_str);
          curApi?.call(curApi?.callArg(process.argv));
      
    • 这里根据com_str一个字符串名称,从apiFactory中获取对应的api子类对象,并执行api的接口call
  2. apiFactory的实现
    • src/rpc/factory/apiFactory.ts
      import { cacheApi } from "./api/cacheApi";
      import { pluginApi } from "./api/pluginApi";
      '''
      '''
      import { IApi } from "./apiBase";
      
      class ApiFactory {
      constructor() {}
      getApi(api: string): IApi | undefined {
          if (api == "cache") {
          return cacheApi;
          } else if (api == "plugin") {
          return pluginApi;
          }
          }
          return undefined;
      }
      }
      export const apiFactory: ApiFactory = new ApiFactory();
      
      
      • 根据字符串创建对应的api功能类
      • 所有api功能类都继承自apiBase
  3. 所有api的基类
    • src/rpc/factory/apiBase.ts
      export interface IApi {
          callArg(arg);
          call(arg): void;
      }
      
      export class ApiBase implements IApi {
          constructor() {}
          callArg(arg: any) {
              console.log("未实现callArg", arg);
          }
          call(arg: any) {
              console.log("未实现call", arg);
          }
          api_argv() {
              console.log("未实现api_argv", arg);
          }
      }