樣例代碼
class OS {
constructor() {
if (new.target === OS) {
throw new Error('不能實例化抽象類')
}
}
}
// 定義具體操做系統的具體產品類
class AndroidOS extends OS {
constructor() {
super()
}
controlHardWare() {
console.log('我會用安卓的方式去操做硬件')
}
}
class HardWare {
constructor() {
if (new.target === HardWare) {
throw new Error('不能實例化抽象類')
}
}
// 手機硬件的共性方法,這裏提取了「根據命令運轉」這個共性
operateByOrder() {
throw new Error('抽象產品方法不容許直接調用,你須要將我重寫!');
}
}
// 定義具體硬件的具體產品類
class QualcommHardWare extends HardWare {
constructor() {
super()
}
operateByOrder() {
console.log('我會用高通的方式去運轉')
}
}
class MobilePhoneFactory {
constructor() {
if (new.target === MobilePhoneFactory) {
throw new Error('不能實例化抽象類')
}
}
// 提供操做系統的接口
createOS() {
throw new Error("抽象工廠方法不容許直接調用,你須要將我重寫!");
}
// 提供硬件的接口
createHardWare() {
throw new Error("抽象工廠方法不容許直接調用,你須要將我重寫!");
}
}
class FakeStarFactory extends MobilePhoneFactory {
constructor() {
super()
}
createOS() {
// 提供安卓系統實例
return new AndroidOS()
}
createHardWare() {
// 提供高通硬件實例
return new QualcommHardWare()
}
}
var ff = new FakeStarFactory()
console.log(ff)
let os = ff.createOS()
console.log(os)
os.controlHardWare()
console.log(new MobilePhoneFactory())
複製代碼
參考地址
- juejin.im/book/5c70fc…
- juejin.im/post/5cd966…