1. 디자인 패턴 (싱글톤 패턴 / 팩토리 패턴)
출처 : 면접을 위한 CS전공지식 노트(책 / 강의)
싱글톤 패턴, 팩토리 패턴
디자인 패턴
디자인 패턴은 프로그램을 설계할 때에 나타났던 문제점들을 객체 (Objects)간의 상호 관계를 이용하여 해결하려고 만든 '규약' 형태이다.
- 라이브러리, 프레임워크가 있다로직에 따라 반복적인 패턴을 라이브러리와 프레임 워크에 포함
하나의 코드로 프로그램을 설계할 수 있지만, 추후에 유지 보수를 하기 어렵다
- 한번에 많은 코드를 수정할 때에 번거롭거나, 오히려 에러를 발생 시킬 수 있다
디자인 패턴이라는 규약을 만들어서 모듈화를 했다
- 프로그래밍을 더 쉽게 할 수 있다
라이브러리 (Library)
공통으로 사용될 수 있는 기능들을 모듈화한 것이다
폴더명, 파일명 등 규칙이 없어서, 프레임워크에 비해 자유롭다
- 유저가 직접 모듈을 컨트롤할 수 있다 (예. 가위를 가지고 종이를 자를 때)
프레임워크 (Framework)
공통으로 사용될 수 있는 기능들을 모듈화한 것이다
폴더명, 파일명 등 규칙들이 존재한다
- 비행기를 타는 것 (비행기를 탈 수만 있지, 비행기를 직접 조종할 수 없다)
axios 라는 라이브러리를 프레임워크, React 또는 Vue 안에 사용할 수 있다
반대로 프레임워크끼리, 즉 React를 Vue와 같이 사용할 수 없다
axios.get('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error)
})
.then(function () {
//always execute
})
-
axios 라이브러리 사용 예시다
.get()
,.then(function (reponse) {})
,.catch(function (error) {})
등 어느 정도 규약은 존재한다- 하지만, 어느 정도 규칙으로 정해져 있지만, React 또는 Vue에서 사용 가능한 형태이다
싱글톤 패턴
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다
주로 데이터베이스 연결 모듈에 많이 사용한다
원래 클래스 부여
a
와b
는 같은 클래스를 사용하는 다른 객체들이
class Dog {
constructor(name) {
this.name = name
}
}
const a = new Dog("Husky")
const b = new Dog("Poodle")
console.log(a === b) // false
싱글톤 패턴을 사용
class Singleton {
constructor () {
if (!Singleton.instance) {
Singleton.instance = this
}
return Singleton.instance
}
getInstance () {
return this.instance
}
}
const a = new Singleton()
const b = new Singleton()
console.log(a === b) // true
싱글톤 패턴의 장점
클래스를 이용할 때마다, 새로운 인스턴스를 만들어내지 않아도 되서, 메모리 비용이 줄어든다
- Network 연결, Database, file system에 요청하는 것은 I/O 바운드라고 한다
- I/O 바운드는 서버에 요청을 하고, 응답을 받아야 하기 때문에 시간이 걸린다
- 이럴 때 싱글톤 패턴을 이용하면, 한번만 연결을 하면 된다
const URL = 'mongodb://localhost:27017/kundolapp'
const createConnection = url => ({"url": url})
class DB {
constructor(url) {
if (!DB.instance) {
DB.instance = createConnection(url)
}
return DB.instance
}
connect() {
return this.instance
}
}
const a = new DB(URL)
const b = new DB(URL)
console.log(a===b)
a
와b
는 싱글톤 패턴에 의해, 따로따로 연결을 안 하고,DB.instance
, 인스턴스 하나를 기반으로 서버와 연결을 한다
싱글톤의 단점
-
TDD (Test Driven Development)
- TDD를 할 때에는 단위 테스트를 진행한다
- 단위 테스트는, 테스트가 서로 독립적이어야 하는데, 싱글톤은 미리 생성한 하나의 인스턴스를 기반으로 하여, 테스트를 할때마다 독립적인 인스턴스를 만들기 어렵다
- 즉 싱글톤에 경우 테스트를 하게 된다면, 순서가 정해져 있다
- TDD는 어떤 순서든 진행이 가능해야 한다. 즉 싱글톤 패턴을 사용하면 TDD를 하기 어렵다
-
의존성이 높아진다
- 클래스에서 하나의 인스턴스만 가지고 있기 때문에, 클래스가 바뀌면 그 하나의 인스턴스를 가지는 모든 객체들도 같이 바뀌어야 한다
팩토리 패턴
상위 클래스와 하위 클래스가 존재한다
상위 클래스는 중요한 뼈대를 가지면서, 어떠한 하위 클래스를 실행할지 정해준다
- 상위 클래스는 인스턴스 생성 방식에 대한 알 필요가 없다
하위 클래스는 객체 생성에 관한 구체적인 내용을 결정한다
class Latte {
constructor() {
this.name = "latte"
}
}
class Espresso {
constructor() {
this.name = "espresso"
}
}
class LatteFactory {
static createCoffee() {
return new Latte()
}
}
class EspressoFactory {
static createCoffee() {
return new Espresso()
}
}
const factoryList = {LatteFactory, EspressoFactory}
class CoffeeFactory {
static createCoffee(type) {
const factory = factoryList[type]
return factory.createCoffee()
}
}
const main = () => {
const coffee = CoffeeFactory.createCoffee("LatteFactory")
console.log(coffee.name)
}
main()
'독서 > CS 노트' 카테고리의 다른 글
6. 프로그래밍 패러다임 (0) | 2023.02.21 |
---|---|
5. 디자인 패턴 (MVC, MVP MVVM 패턴) (0) | 2023.02.19 |
4. 디자인 패턴 (프록시 패턴) (0) | 2023.02.17 |
3. 디자인 패턴 (전략 패턴, 옵저버 패턴) (0) | 2023.02.16 |
2. 디자인 패턴 (이터레이터 패턴, 의존성 주입) (0) | 2023.02.15 |