1.构造器模式
-
构造器
当新对象的内存被分配后,用来初始化对象的一个特殊的函数
-
什么是构造器模式
构造器模式即以构造器的角度来创建对象,通过对比以不同构造器的方式创建对象,选择出最佳性能来创建对象
-
es5之前创建对象的方式
// 1.字面量 var obj = { uname: 'zt', age: 19 } // 2.Object对象创建空对象 不方便对象属性赋值 var obj2 = new Object(); // 3.Object.create()方式常见可继承于某个对象的新对象,不直观 var obj3 = Object.create(); // 3.构造函数 不方便继承操作,每次新增对象让其指向同一个对象函数 function Fn() { this.uname = 'zt', this.age = 19 } var obj4 = new Fn();// 通过new 方式 将函数Fn中的属性uname等作为构造对象obj4的属性
-
es5之后方式
通过原型prototype使其子对象可以公用父对象的属性
2.工厂模式
-
什么是工厂模式
也是从创建对象的角度出发,但是不同于构造器模式明确要求使用构造器来实现,而此模式提供了创建对象的公共接口,而创建对象的方式则被封装在工厂中,只需要调用工厂接口不需要知道具体的实现,就可以创建不同类型的对象
-
案例(使用工厂模式创建对象)
// Types.js - Constructors used behind the scenes // A constructor for defining new cars function Car( options ) { // some defaults this.doors = options.doors || 4; this.state = options.state || "brand new"; this.color = options.color || "silver"; } // A constructor for defining new trucks function Truck( options){ this.state = options.state || "used"; this.wheelSize = options.wheelSize || "large"; this.color = options.color || "blue"; } // FactoryExample.js // Define a skeleton vehicle factory function VehicleFactory() {} // Define the prototypes and utilities for this factory // Our default vehicleClass is Car VehicleFactory.prototype.vehicleClass = Car; // Our Factory method for creating new Vehicle instances VehicleFactory.prototype.createVehicle = function ( options ) { if( options.vehicleType === "car" ){ this.vehicleClass = Car; }else{ this.vehicleClass = Truck; } return new this.vehicleClass( options ); }; // Create an instance of our factory that makes cars var carFactory = new VehicleFactory(); var car = carFactory.createVehicle( { vehicleType: "car", color: "yellow", doors: 6 } ); // Test to confirm our car was created using the vehicleClass/prototype Car // Outputs: true console.log( car instanceof Car ); // Outputs: Car object of color "yellow", doors: 6 in a "brand new" state console.log( car );
-
使用场景
- 创建对象比较复杂的情况下
- 当需要生成不同对象类型的实例的时候
- 不同对象类型之间需要公用一些数据的时候
-
抽象工厂
3.抽象工厂模式
- 以一个通用的目标将一组独立的工厂进行封装。
- 使用场景:适用于必须从其创建或生成对象的方式处独立,或者需要同多种类型的对象一起工作的情况下。