工厂模式定义一个用于创建对象的接口,
var PaperFloderCreatorFactory = function (user, paths, pathModel) { };
将要创建不同的类可以看作模具,用以创建不同的实例类。
PaperFloderCreatorFactory.Creators = { 'spec_html': paperHtmlCreator, 'lib': paperLibCreator, 'practices': paperPracticesCreator, 'specs': paperPracticesCreator };
工厂要根据客户的需求生产不同的实例类
PaperFloderCreatorFactory.create_file_creator = function (file, user, paths, pathModel) { var Model = PaperFloderCreatorFactory._forCreator(file); return new Model(user, paths, pathModel, file); };
要生产的类模块,而这些实例经常都拥有相同的接口.
function PaperHtmlCreator(user, paths, pathModel, type){ this.user = user; this.paths = paths; this.pathModel = pathModel; this.type = type; } PaperHtmlCreator.prototype.create_floder = function(){ var self = this; return new Promise(function(resolve){ if(! self.paths) resolve(); FileOperate.copy_file_and_rename(self.paths,self.pathModel.get_paper_course_path(self.user,'practices')); resolve(); }) };
function PaperLibCreator(user, paths, pathModel,type){ this.user = user; this.paths = paths; this.pathModel = pathModel; this.type = type; } PaperLibCreator.prototype.create_floder = function () { var self = this; return new Promise(function (resolve) { if(! self.paths) resolve(); FileOperate.copy_dir(self.paths, self.pathModel.get_paper_course_path(self.user, 'lib'), function () { resolve() }) }) };
使用生产的实例类
floder_creator = PaperFloderCreatorFactory.create_file_creator(key, user, paths, pathModel);
工厂模式适用的模式
- 对象的构建十分复杂
- 需要根据不同的要创建不同的实例或者大量属性相同的属性的小对象
工厂有利于代码结构的清晰,也可以是模块职责的单一化。