let _producer = null;
export const producer = () => {
if (_producer) {
return _producer;
} else {
try {
const client = new kafka.KafkaClient(producerConfig);
_producer = new HighLevelProducer(client);
//...
return _producer;
} catch (err) {
log.error(`Error from Kafka Producer Ready : ${err}`);
return process.exit(1);
}
}
};
- 같은 객체가 리턴되는지 확인
```javascript
function republishTest() {
const a = producer();
const b = producer();
const d = new Kafka("jy_test")
const e = new Kafka("jy_test2")
setTimeout(() => {
console.log(a === b); //true
console.log(d === e); //false
}, 3000);
}
const instance = new UserStore();
Object.freeze(instance);
export default instance;
- instance 를 export 해서 쓰는데, 클래스 자체를 export 하지 않았기 때문에 밖에서 new UserStore 진행시 ERROR 발생 (TypeError: _UserStore.default is not a constructor)
## Template method pattern
- 알고리즘 뼈대를 만들고 세부사항(특정단계)은 각 세부 클래스들이 진행하도록 한다.
- javascript의 경우에는 약간의 편법이 필요하다..
- typescript의 경우에는 abstract를 지원하기 때문에 보다 편하게 가능하다.
- 개인적으로 factory pattern과 같이 사용함. (concreateClass가 많아짐에 따라서, 생성한다)
### abstractClass
GoF 디자인 패턴 종류
Singleton Pattern
적용 전
적용 후
producer.js
ES6+ 에서 어떻게 사용할까?
object literal 을 이용한 방법
const UserStore = { add: item => _data.push(item), get: id => _data.find(d => d.id === id) }
Object.freeze(UserStore); export default UserStore;
class UserStore { constructor(){ if(!UserStore.instance){ this._data = []; UserStore.instance = this; }
return UserStore.instance; }
//rest is the same code as preceding example
}
const instance = new UserStore(); Object.freeze(instance);
export default instance;
abstract class ABSTRACT_CLASS { runAlgorithm() { this.step1() this.step2() this.step3() } abstract step1(): void; abstract step2(): void; abstract step3(): void; }
class MyBehaviour extends ABSTRACT_CLASS { step1() { log("My step 1") } } step2() { log("My step 2") } step3() { log("My step 3") } } //...
const my = new MyBehaviour() my.runAlgorithm()
//My step 1 //My step 2 //My step 3
reference