Singleton Pattern
JavaScript ๊ธฐ์ค์ผ๋ก ์ค๋ช ํฉ๋๋ค.
์ฉ์ด
์ธ์คํด์ค(Instance): ์ด๋ค ์์ฑ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์๋ก์ด ๊ฐ์ฒด (mdn)
์์ฑ์๊ฐ ์ฟ ํค๋ฅผ ์ฐ์ด๋ผ ์ ์๋ ์ฟ ํค ํ์ด๋ผ๋ฉด, ์ธ์คํด์ค๋ ์ฟ ํค ํ์์ ์ฐ์ด๋ธ ์ฟ ํค์ด๋ค.
์ธ์คํด์คํ(Instantiation): ์์ฑ์๋ก๋ถํฐ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ
๊ฐ์ฒด ๋ฆฌํฐ๋ด(Object literal): ์ค๊ดํธ(
{}
)๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ ๋ฐฉ์ (mdn)
์๋ฏธ์ ํน์ฑ
ํด๋์ค์ ์ธ์คํด์คํ๋ฅผ ๋จ์ผ ์ธ์คํด์ค๋ก ์ ํํ๋ ํจํด์ด๋ค.
์ฑ๊ธํค ํจํด์ ์๋์ ๊ฐ์ ํน์ฑ์ ๊ฐ๋๋ค.
๋จ์ผ ์ธ์คํด์ค๊ฐ ๋ณด์ฅ๋๋ค.
ํด๋น ์ธ์คํด์ค์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค.
๊ตฌํ ์์
์ฑ๊ธํค ํจํด์ผ๋ก ์ปค์คํ
Logger ๊ตฌํํ๊ธฐ
let instance;
let logCounter = 0;
class Logger {
constructor() {
if (instance) {
throw new Error("์ค๋ณต์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.");
}
instance = this;
}
getInstance() {
return this;
}
success(message) {
++logCounter;
console.log(`SUCCESS(${logCounter}): ${message}`);
}
error(message) {
++logCounter;
console.log(`ERROR(${logCounter}): ${message}`);
}
}
const logger = Object.freeze(new Logger()); // logger ๊ฐ์ฒด์ ์์ ์ ๋ฐฉ์งํ๋ค.
๋จ์ผ ์ธ์คํด์ค๊ฐ ๋ณด์ฅ๋๊ธฐ ๋๋ฌธ์ success
, error
๋ฉ์๋๊ฐ ์ด๋์์ ํธ์ถ๋๋๋ผ๋ logCounter
๊ฐ์ด ๊ณต์ ๋๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๊ตฌํํ๊ธฐ
let logCounter = 0;
const logger = {
success(message) {
++logCounter;
console.log(`SUCCESS(${logCounter}): ${message}`);
},
error(message) {
++logCounter;
console.log(`ERROR(${logCounter}): ${message}`);
},
};
Object.freeze(logger);
์ฅ์
๋จ์ผ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ ์ฝ๋๋ค.
๋จ์
๋จ์ ํ ์คํธ๊ฐ ์ด๋ ต๋ค.
ํ ์คํธ๋ง๋ค ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋์ ์ธ์คํด์ค๋ก ๋ชจ๋ ํ ์คํธ๊ฐ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. ์ฆ, ๋ชจ๋ ํ ์คํธ๋ค์ ์ด์ ํ ์คํธ์์ ์์ฑ ๋๋ ์์ ํ ์ธ์คํด์ค๋ฅผ ์์ ํด์ผ ํ๊ณ , ์ด๋ ๊ฒ ํ๊ฒฝ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ํ ์คํธ๋ ์คํ ์์ ๋ฑ์ ๋ฐ๋ผ ์๊ธฐ์น ๋ชปํ ๋์์ ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
๋จ์ผ ์ฑ ์ ์์น์ ์๋ฐฐ๋๋ค.
๋จ์ผ ์ธ์คํด์ค๋ฅผ ๋ณด์ฅํ๋ฉฐ, ์ธ์คํด์ค์ ๋ํด ์ ์ญ ์ ๊ทผ์ ์ ๊ณตํ๋ ๋ ๊ธฐ๋ฅ์ ๋์์ ํ๊ธฐ ๋๋ฌธ์, ๋จ์ผ ์ฑ ์ ์์น์ ์๋ฐฐ๋๋ค.
์ ์ญ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
์ด๋ ์ฑ๊ธํค ํจํด์ ํน์ง์ด์ ๋จ์ ์ธ๋ฐ,
var
๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ์ด์ ์์ ์ ์ ์๋ฏ ์๋ฌด ๊ณณ์์๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ ์ญ ์ํ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค.
์ฐธ๊ณ ์๋ฃ
Last updated