工厂模式 是用来创建对象的一种最常用的设计模式。工厂模式不暴露创建对象的具体逻辑,而是将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式常见于大型项目,例如 jQuery 的 $
对象,我们创建选择器对象之所以没有 new selector
就是因为 $()
已经是一个工厂方法,其他例子例如 React.createElement()
、Vue.component()
都是工厂模式的实现。
工厂模式根据抽象程度的不同可以分为三种:
eval()
来完成智能工厂工厂的目的:在于判断接口最终用哪个类实例化(故与接口密不可分)。
使用工厂最终达到的效果是:多态,和类与类之间的松耦合。
function createPerson(name, age, job) {let person = new Object();person.name = name;person.age = age;person.job = job;person.sayNam = function () {console.log(`I'm ${name}`);};return person;}const person1 = createPerson('Ben', 21, 'student');const person2 = createPerson('Gray', 25, 'Doctor');
函数 createPerson()
能够根据接受的参数来构建一个包含所有必要信息的 Person
对象。可以无数次调用这个函数,而每次它都会返回一个包含三个属性一个方法的对象。工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。
class User {constructor(name, auth) {this.name = name;this.auth = auth;}}class UserFactory {static createUser(name, auth) {//工厂内部封装了创建对象的逻辑://权限为 admin 时,auth=1;权限为 user 时,auth 为 2//使用者在外部创建对象时,不需要知道各个权限对应哪个字段, 不需要知道赋权的逻辑,只需要知道创建了一个管理员和用户if (auth === 'admin') return new User(name, 1);if (auth === 'user') return new User(name, 2);}}const admin = UserFactory.createUser('cxk', 'admin');const user = UserFactory.createUser('xz', 'user');