【发布时间】:2020-12-07 17:46:21
【问题描述】:
file AuthLogin.js
import axios from "axios";
const LISTS = {
USER: "Users",
STAFF: "DoStaff",
DOCTOR: "ctor",
CLINIC: "Clinic",
EPHARMACY_ADMIN: "EpharmacyAdmin",
};
// const baseURL = "https://user.api.edoctor.io";
const baseURL = process.env.USER_API;
const AuthLogin = () => {
const AuthAPI = (() => {
var instance;
const http = axios.create({
baseURL: baseURL,
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
});
const createInstance = () => {
return {
signOut: (url) => signOut(url),
signIn: (url, payload) => signIn(url, payload),
signInFB: (url, payload) => signInFB(url, payload),
signInSmsVerify: (url, payload) => signInSmsVerify(url, payload),
signInSmsRequest: (url, payload) => signInSmsRequest(url, payload),
signInGoogle: (url, platform, idToken) =>
signInGoogle(url, platform, idToken),
};
};
const signInSmsRequest = async (url, payload) => {
await http.post(url, payload);
};
const signInSmsVerify = async (url, payload) => {
const response = await http.post(url, payload);
return response?.data;
};
const signIn = async (url, payload) => {
const response = await http.post(url, payload);
return response?.data;
};
const signInFB = async (url, accessToken) => {
const response = await http.post(url, { accessToken });
return response?.data;
};
const signInGoogle = async (url, platform, idToken) => {
const response = await http.post(url, { platform, idToken });
return response?.data;
};
const signOut = async (url) => {
return "signOut";
// return await http.post("auth/sign_out", {});
};
return {
getInstance: () => {
if (!instance) instance = createInstance();
return instance;
},
};
})();
const authFactory = (() => {
const createAuth = function (type) {
return getLists(type);
};
return { createAuth };
})();
const getLists = (type) => {
var lists = {
Doctor: () => {
return {
signInSmsRequest: (url, payload) =>
authAPI.signInSmsRequest(url, payload),
signInSmsVerify: (url, payload) =>
authAPI.signInSmsVerify(url, payload),
};
},
EpharmacyAdmin: () => {
return {
signOut: (url) => authAPI.signOut(url),
signIn: (url, payload) => authAPI.signIn(url, payload),
};
},
};
return lists[type]();
};
var authAPI = AuthAPI.getInstance();
return {
LISTS,
useAPI: () => authAPI,
useAuth: (key) => authFactory.createAuth(key),
};
};
export default AuthLogin;
file App.js
const { useAPI, LISTS, useAuth } = AuthLogin();
useEffect(() => {
(async () => {
await useAuth(LISTS.EPHARMACY_ADMIN).signOut();
})();
}, []);
单例在需要从单个中心位置协调系统范围的操作的情况下很有用。一个例子是数据库连接池。池管理整个应用程序的所有数据库连接的创建、销毁和生命周期,确保没有“丢失”连接。
抽象工厂创建由共同主题相关的对象。在面向对象编程中,工厂是创建其他对象的对象。抽象工厂抽象出了一个由新创建的对象共享的主题。
我正在尝试理解一个非常常用的设计模式 Factory 和 signton,我已经将最好的设计模式放在一起,但我的代码重叠很多,我还没有解决方法,也不知道。更优化?希望你能帮忙?
【问题讨论】:
标签: javascript reactjs oop factory