// 管理类只产生一个对象
// 一个管理类 只产生一个对象---去 管理所有对象A B C
// 一个类 可能有很多对象A B C
//
class SoundManager {
// static直接类名调用
static Instance = new SoundManager()
private static instance: soundManager = null;//null给不给都行
private constructor() {
}
static Instance() {
//当前单例是否产生
if (!SoundManager.instance) {
SoundManager.instance = new SoundManager()
}
return SoundManager.instance
}
}
// 怎么保证只产生一个
let soundManager = new SoundManager();
// 用管理类 都不会变 最简单的单例模式
SoundManager.Instance //代表属性这个会已经产生对象
// 第二种方法 节省内存 懒加载方法实现单例
soundManager.instance() //代表方法
代理模式
// 代理模式 做事的时候找一个代理人去做
//不同代理 结果可能不同
// 类似 任务 ->多个赏金猎人
// 写两个人计算
interface ICalc {
calc(num1, num2): number
}
class Npc1 implements ICalc {
calc(num1, num2) {
return num1 + num2
}
}
class Npc2 implements ICalc {
calc(num1, num2) {
return num1 - num2
}
}
class Person {
//定义一个属性 用哪个代理
delegate: ICalc;
// 计算数字
getNum(num1, num2) {
// 拿到num1和num2计算的结果 本身不计算 别人计算
let num = this.delegate.calc(num1, num2)
console.log(num + '')
}
}
let person = new Person()
// 设定一个代理
person.delegate = new Npc1()
person.getNum(3, 4)
观察者模式
//观察者模式 很多对象监听一个对象的属性 状态 发生改变的时候会通知所有监听他的人
// 一天时间 变化 -> 玩家会自动拿手电,背景场景变色,敌人睡觉 一对多
// 协议
interface IOberver {
nameChange(newName)
}
class Person {
private _name: string
//所有的观察者
observers: Array<IOberver> = new Array < IOberver > ()
set name(value) {
this._name = value
// 发生变化 遍历观察者数组,给所有的观察者发消息
for (let observer of this.observers) {
observer.nameChange(this.this._name)
}
}
get name() {
return this._name
}
}
class Test implements IOberver {
nameChange(newName) {
console.log('监听变化名字变为', newName);
}
}
let person = new Person()
let test = new Test()
// 设置为监听对象
person.obserbers.push(test)
person.name = '哈哈哈'
工厂模式
// 工厂模式 汽车工厂
// 我要一个奥迪 我要一个宝马 需求
enum CarType {
Bmw,
Audi,
Benz
}
// 创建对象的模式
class Car {
name: String;
// 工厂方法 用另外有一种方式创建对象
static Create(carType: CarType): Car {
let car: Car
switch (carType) {
case CarType.Audi:
car = new Audi()
break;
case CarType.Benz:
car = new Benz()
break;
case CarType.Bmw:
car = new Bmw()
break;
}
return car
}
}
class Bmw extends Car {
}
class Audi extends Car {
}
class Audi extends Car {
}
// 生成一个宝马
let bmw = Car.Create(CarType.Bmw)