项目地址
项目背景
leetcode_extension项目是一个Visual Studio Code插件,在插件市场也有发布
工厂模式相关概念
- 创建型模式
- 主要解决:解决接口选择问题
- 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
- 优点:
- 根据字符串名称创建对象
- 扩展性高,如果想增加一个子类功能,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心可使用的接口。
- 缺点:
- 每增加一个功能,都需要改动增加一个具体的子类和对象实现工厂。
- 类的数量变多,复杂度上升,系统对具体类的依赖
项目中的代码
- 调用入口
- src/rpc/childMain.ts
let curApi: IApi | undefined = apiFactory.getApi(com_str); curApi?.call(curApi?.callArg(process.argv));
- 这里根据com_str一个字符串名称,从apiFactory中获取对应的api子类对象,并执行api的接口call
- src/rpc/childMain.ts
- 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
- src/rpc/factory/apiFactory.ts
- 所有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); } }
- src/rpc/factory/apiBase.ts