TypeScript设计模式之工厂(2)

继续用枪,外加子弹,用TypeScript写一个抽象枪工厂来看看抽象工厂模式:

interface Shootable{ shoot(); } abstract class Gun implements Shootable{ // 抽象产品 - 枪 private _bullet: Bullet; addBullet(bullet: Bullet){ this._bullet = bullet; } abstract shoot(); } class AK47 extends Gun{ //具体产品 - AK47 shoot(){ console.log(`ak47 shoot with ${this._bullet}.`); } } class M4A1 extends Gun{ //具体产品 - M4A1 shoot(){ console.log(`m4a1 shoot with ${this._bullet}.`); } } abstract class Bullet{ // 抽象子弹 abstract name: string; } class AkBullet{ // AK 子弹 name: string = 'ak bullet'; } class M4Bullet{ // m4a1 子弹 name: string = 'm4a1 bullet'; } abstract class ArmFactory{ //抽象军工厂 abstract createGun(): Gun; abstract createBullet(): Bullet; } class AK47Factory extends ArmFactory{ createGun(): Gun{ let gun = new AK47(); // 生产Ak47 console.log('produce ak47 gun.'); this.clean(gun); // 清理工作 this.applyTungOil(gun);// Ak47是木头枪托,涂上桐油 return gun; } private clean(gun: Gun){ //清洗 console.log('clean gun.'); } private applyTungOil(gun: Gun){ //涂上桐油 console.log('apply tung oil.'); } createBullet(): Bullet{ return new AkBullet(); } } class M4A1Factory extends ArmFactory{ //M4A1工厂 createGun(): Gun{ let gun = new M4A1(); // 生产M4A1 console.log('produce m4a1 gun.'); this.clean(gun); // 清理工作 this.sprayPaint(gun); // M4是全金属,喷上漆 return gun; } private clean(gun: Gun){ //清洗 console.log('clean gun.'); } private sprayPaint(gun: Gun){ //喷漆 console.log('spray paint.'); } createBullet(): Bullet{ return new M4Bullet(); } } //使用 function shoot(gun: Gun, bullet: Bullet) // 使用生产的枪和子弹 { gun.addBullet(bullet); gun.shoot(); } let akFactory = new AK47Factory(); shoot(akFactory.createGun(), akFactory.createBullet()); let m4a1Factory = new M4A1Factory(); shoot(m4a1Factory.createGun(), m4a1Factory.createBullet()); //输出 produce ak47 gun. clean gun. apply tung oil. add bullet: ak bullet ak47 shoot with ak bullet. produce m4a1 gun. clean gun. spray paint. add bullet: m4a1 bullet m4a1 shoot with m4a1 bullet.

工厂除了生产枪外还生产子弹,子弹和枪算是一个产品族,使用者接触到的只有抽象工厂和抽象产品,隐藏了具体实现细节。
在大的框架下面有很多小项目时用抽象工厂配合如动态对象生成之类的技术就可以很容易实现灵活的架构。

关于TypeScript的推荐文章

使用Visual Studio Code开发TypeScript 

WebStorm下使用TypeScript 

TypeScript 基本语法 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d4fc089ca7eb0bdd6149c4e421eebc47.html