创建型模式
1. 构造器模式(构造函数)
用于创建同一类的不同对象
比如我要录入学生信息,每一个学生都是一个具体的对象,录入一个学生就要创建一个对象,上百各学生就要创建上百个对象吗?
const xiaoming={
name:'xiaoming',
age:18,
id:'34234211'
}
const xiaohong={
name:'xiaohong',
age:17,
id:'32565453'
}
// 不可能给每一个学生都手动创建对象
// 使用构造函数来创建对象,这也是为什么要使用类
function Student(name,age,id){
this.name=name
this.age=age
this.id=id
}
const xiaoguang=new Student('xiaoguang',19,'34214552')
2. 工厂模式
用于创建不同类的不同对象,工厂不可能只生产单一的商品,它有不同的模具,可以生产不同类型的商品
如果没有工厂模式,我们如何去生产这些动物?我们就需要各种new
我们要手动去创建对象去管理这些对象对不对。
工厂模式做了什么?我们只需要提要求,由工厂帮我们去创建管理这些对象,相当程度上简化了我们的工作。
type AnimalType='pig'|'sheep'|'cattle'
function Factory(type){
switch(type){
case "pig":
// 一些处理
return new Pig()
case "sheep":
// 一些处理
return new Sheep()
case "cattle"
// 一些处理
return new Cattle()
default:
throw new Error('错误')
}
}
const pig=Factory('pig')
使用工厂函数我们创建和管理对象就变得更方便了
3. 抽象工厂
虽然工厂函数为我们提供了很多便利,但是它还是有不小的问题,比如这个工厂完全依赖于它养殖的对象,它只能养猪、羊、牛它没办法养其它东西了对吧。这个违背了依赖倒置原则,高层模块不能依赖于低层模块,都因该依赖于抽象。
现在要改造这个养殖场,让它能养任何动物,因该怎么做?
不管你是什么动物,只要你实现了Animal 接口,我这养殖场就可以养。以后想养什么就养什么,再也不用改造养殖场。
这就是模块不能依赖于具体,要依赖于抽象。
4. 原型模式 JavaScript继承
首先了解类、对象、原型之间的关系
类和对象是通过原型关联起来的,确定了原型就能知到对象的类是谁。
function Student(){
toExam(){
console.log('去考试')
}
}
当我们通过这个构造函数创建多个对象时,每个对象都会有这个toExam
方法,由于这个方法每个对象都是一样的,我们没有必要给他们都添加这个方法。只需要将这个方法放在原型上就好了
Student.prototype.toExam=()=>{console.log('去考试')}
原型模式就是让你将重复的方法和属性挂载到原型上。