软件设计模式([Design pattern](baike.baidu.com/item/Design pattern/10186718?fromModule=lemma_inlink)),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
设计模式的作用是:为我们在进行稍微复杂的程序设计时,迅速提高可靠的解决方案。而不是等待问题暴露了,再去修复我们的程序
1991年,Erich Gamma 与Richard Helm, Ralph Johnson ,John Vlissides合作出版了Design Patterns - Elements of Reusable Object-Oriented Software 一书,在此书中共收录了23个设计模式
在实际开发中,很少会有程序员在同一个项目中全部用上以上的23种设计模式。所以边学边用、学以致用即可。
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
好比如在一个规模不大的公司中,存在以下的角色
但其实由始至终,都只是你一个人在充当以上的角色而已。
太多了
进入正题,众所周知,每当我们new一个实例的时候,内存中都会开辟一个新的空间,此时不同的实例是存在各自的内存空间中的。
对应内存示意图为:
因为new天生的特性就会开辟新内存空间,因此我们改造的方向是不让用户通过new来创建实例。替换成静态方法的方式来创建
核心代码在于 static getInstance 这里,它用过判断是否已经存在实例来决定是否要执行new操作
对比结果:
但是这个时候可能会有小伙伴忘记我们使用了单例模式了,它还是一样会通过new的方式创建对象
此时我们可以将 constructor 设置为 私有,这样当小伙伴new的时候,便会有一个语法错误提示
ps: artTs中 不能 使用 new.target 来判断用户是否存在new的行为
class Person {
static instance: Person | null = null
static getInstance() {
if (!Person.instance) {
Person.instance = new Person()
}
return Person.instance
}
// 设置方法为私有
private constructor() {
}
}
const p1 = Person.getInstance()
const p2 = Person.getInstance()
console.log("", p1 === p2)// true