<aside> 💡 팩토리 패턴과 팩토리 메서드 패턴은 다른것이다. 팩토리 패턴은 객체 자체가 부품인 공장인것이다. 그 공장에 어떤 부품(객체)주세요 ~ 했을때 그 부품을 내어준다.

반면에 팩토리 메소드 패턴은 부품 자체를 만드는 일이다. 이 부품에 이런이런 재료들이 필요해요~

해서 넘겨주면 그 부품을 만들어준다.

단위가 다른것이다.

</aside>

클래스

class TodoModel {
    constructor(){
				//멤버 변수 2개 정의(public)
        this.todos = [];
        this.lastChange = null;
    }
		//메소드 3개 정의 (public)
    addToPrivateList(){}
    add() {}
    reload(){}
}

팩토리 메소드 패턴

function TodoModel(){
		//Private 영역
    var todos = [];
    var lastChange = null;
        
    function addToPrivateList(){}
    function add() {}
    function reload(){}
 		//Private 영역
   
    return Object.freeze({
        add, //public
        reload //public
    });
}

<aside> 💡 Object.freeze → 인자로 넘겨진 객체와 그 객체의 프로토타입의 속성 변경을 금지시키는 메소드 → freeze된 인자 객체를 리턴함

</aside>

클래스의 문제점1 - 캡슐화불가능

클래스의 문제점2 - this, context소실문제

class TodoModel {
    constructor(){
        this.**todos** = [];
    }
    
    reload(){ 
        setTimeout(function log() { 
           console.log(**this.todos**);
        }, 0);
    }
}
todoModel.reload(); // undefined 출력, 콜백 내에서 context 소실
function TodoModel(){
    var **todos** = [];
        
    function reload(){ 
        setTimeout(function log() { 
           console.log(**todos**);        //[]
       }, 0);
    }
}
todoModel.reload();                   //[]
$("#btn").click(todoModel.reload);    //[], 

물론 클래스 키워드에서도 이런 문제들을 해결할 수 있다.

arrow function 활용