什么是工厂模式
定义一个 用于创建对象 的接口。(但是让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。)
工厂
创建其他对象 的对象构造方法的抽象
说明
1.这个接口 由子类决定 实例化哪一个类。所创建的 实例类型 由所属实例 指定,因此不知道具体类的情况下,为客户提供一种创建对象的接口
2.子类 可以重写 接口方法 以便创建的时候 指定 自己的对象类型
用来干啥
用来定义接口的
- 定义什么接口? 定义 创建对象的 接口。
这种模式 抽象了 创建对象的过程。
首先,ECMAScript中无法创建类,so,有人发明一种函数,用来封装 以特定接口创建对象 的细节。
栗子:
function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ console.log(this.name); } return o;}var person1 = createPerson('Amy', 18, "Software Engineer");var person2 = createPerson('Bob', 21, "Doctor");
函数createPerson()能够 根据接受的参数 来构建一个包含所有必要信息的Person对象。
- 什么时候使用工厂模式,以下几种情景下工厂模式特别有用: .对象的构建十分复杂 .需要依赖具体环境创建不同实例 .处理大量具有相同属性的小对象
优缺点
缺点:
1、重构已经存在的类会破坏客户端代码。2、因为工厂方法所实例化的类具有私有的构造方法,所以这些类就不能扩展了。
3、如果确实扩展了工厂方法所实例化的类(例如将构造方法设为保护的,虽然有风险但也是可行的),子类必须具有所有工厂方法的一套实现。