🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[toc] ### 简单工厂模式 简单工厂模式(Simple Factory),又叫静态工厂方法,由一个工厂对象决定创建某一种实例,主要用来创建同一类实例。 ```js var factory = function(args){ //工厂函数,根据type类型选择创建某一个类的实例 var o = new Object(); //所有实例共有的方法 o.func = function(){ //... } //指定不同的方法 if(){ o.func1 = function(){ //... } }else{ o.func2 = function(){ //... } } return o; } var obj = factory(args) ``` ### 工厂方法模式 工厂方法模式(Factory Methods),简单工厂模式只适合创建单一类型的实例,工厂方法模式将实际创建对象的工作推迟到子类中。 ```js //安全模式的工厂函数(通过判断this来判断是否使用new关键字) var Factory = function(type,content){ if(this instanceof Factory){ //如果使用new关键字,则查找原型链并创建对象 var s = new this[type](content); return s; }else{ return new Factory(type,content); //如果没有使用new关键字 } } //在工厂原型中创建所有类型数据的基类,添加时只需要修改原型即可。 Factory.prototype = { Java:function(content){ //... }, JavaScript:function(content){ //... }, php:function(content){ //... } } ``` ### 抽象工厂模式 抽象工厂模式(Abstract Factory) 抽象类:是一种声明但是不能直接使用的类 ```js //抽象工厂方法 var AbstractFactory = function(subType,SuperType){ if(type abstracFactory[subType] === 'function'){ //如果原型链上存在对应的抽象类 //缓存类 function F(){}; //继承父类的方法和属性 F.prototype = new AbstractFactory(superType)(); //子类的构造器指向子类 subType.constructor = subType; //子类的原型指向父类 subType.prototype = new F(); }else{ throw new Error("不存在对应的抽象类") } } //Car抽象类 AbstractFactory.Car = function(){ this.type = "car"; } AbstractFactory.Car.prototype = { getPrice:function(){}, getSpeed:function(){} } //Bus抽象类 AbstractFactory.Bus = function(){ this.type = "bus"; } AbstractFactory.Bus.prototype = { getPrice:function(){}, getSpeed:function(){} } ``` ### 建造者模式 建造者模式(Builder)将一个复杂对象构建层与表示层分离,同样的构建过程采用不同的表示 ```js //三个类可以对参数进行解析 var Human = function(){...}; var Name = function(name){...}; var Work = function(work){...}; //在创建person时分别实例化了三个对象,然后将三个对象组合返回 var Person = function(name,work){ var _person = new Human(); _person.name = new Name(name); _person.work = new Work(work); return _person; } ``` ### 原型模式 原型模式(Prototype)用原型实例指向创建对象的类,可以使得新创建的实例共享原型对象的属性以及方法 ```js var Person = function(name){ this.name = name; } Person.prototype = { sayHi:function(){}, run:function(){} } ``` ### 单例模式 单例模式(Singleton)只允许实例化一次的对象类,常用来定义命名空间,用来管理代码库的各个模块 ```js var A = { Util:{ func1:function(){}, func2:function(){} }, Tool:{ }, Ajax:{ } } ``` 在使用时候可以根据命名空间区分不同的方法避免命名冲突