看看用TypeScript怎样实现常见的设计模式,顺便复习一下。
学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想记住就好。
这里尽量用原创的,实际中能碰到的例子来说明模式的特点和用处。

简单工厂模式 Simple Factory

特点:把同类型产品对象的创建集中到一起,通过工厂来创建,添加新产品时只需加到工厂里即可,也就是把变化封装起来,同时还可以隐藏产品细节。

用处:要new多个同一类型对象时可以考虑使用简单工厂。

注意:对象需要继承自同一个接口。

下面用TypeScript写一个枪工厂来看看简单工厂模式:

enum GunType{AK,M4A1,
}interface Shootable{shoot();
}abstract class Gun implements Shootable{ // 抽象产品 - 枪abstract shoot();
}class AK47 extends Gun{ //具体产品 - AK47shoot(){console.log('ak47 shoot.');}
}class M4A1 extends Gun{ //具体产品 - M4A1shoot(){console.log('m4a1 shoot.');}
}class GunFactory{static createGun(type: GunType): Gun{switch(type){case GunType.AK:return new AK47();case GunType.M4A1:return new M4A1();default:throw Error('not support this gun yet');}}
}GunFactory.createGun(GunType.AK).shoot();
GunFactory.createGun(GunType.M4A1).shoot();//输出
ak47 shoot.
m4a1 shoot.

上面代码GunFactory工厂就是根据类型来创建不同的产品,使用的时候只需要引入这个工厂和接口即可。
这样就把变化封装到了工厂中,如果以后要支持狙击枪,只需要加个实现Gun接口的Sniper类就可以了。

工厂方法模式 Factory Method

特点:把工厂抽象出来,让子工厂来决定怎么生产产品, 每个产品都由自己的工厂生产。

用处:当产品对象需要进行不同的加工时可以考虑工厂方法。

注意:这不是所谓的简单工厂的升级版,两者有不同的应用场景。

继续用TypeScript写一个枪工厂来看看工厂方法模式:

interface Shootable{shoot();
}abstract class Gun implements Shootable{ // 抽象产品 - 枪abstract shoot();
}class AK47 extends Gun{ //具体产品 - AK47shoot(){console.log('ak47 shoot.');}
}class M4A1 extends Gun{ //具体产品 - M4A1shoot(){console.log('m4a1 shoot.');}
}abstract class GunFactory{ //抽象枪工厂abstract create(): Gun;
}class AK47Factory extends GunFactory{ //Ak47工厂create(): Gun{let gun = new AK47();  // 生产Ak47console.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.');}
}class M4A1Factory extends GunFactory{ //M4A1工厂create(): Gun{let gun = new M4A1();   // 生产M4A1console.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.');}
}let ak47 = new AK47Factory().create();
ak47.shoot();let m4a1 = new M4A1Factory().create();
m4a1.shoot();//output
produce ak47 gun.
clean gun.
apply tung oil.
ak47 shoot.produce m4a1 gun.
clean gun.
spray paint.
m4a1 shoot.

可以看到Ak47和M4A1在生产出来后的处理不一样,Ak需要涂桐油,M4需要喷漆,用简单工厂就比较难做到,所以就每个产品都弄个工厂来封装各自己的生产过程。
另外的好处是当加入其他枪比如沙漠之鹰时,再加一个产品和产品工厂就好了,并不需要改变现有代码,算是做到了遵守开闭原则。
缺点也明显,增加一个产品就需要多加两个类,增加了代码复杂性。

抽象工厂模式 Abstract Factory

特点:同样隐藏了具体产品的生产,不过生产的是多种类产品。

用处:当需要生产的是一个产品族,并且产品之间或多或少有关联时可以考虑抽象工厂方法。

注意:和工厂方法的区别,工厂方法是一个产品, 而抽象工厂是产品族,线和面的区别。

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

interface Shootable{shoot();
}abstract class Gun implements Shootable{ // 抽象产品 - 枪private _bullet: Bullet;addBullet(bullet: Bullet){this._bullet = bullet;}abstract shoot();
}class AK47 extends Gun{ //具体产品 - AK47shoot(){console.log(`ak47 shoot with ${this._bullet}.`);}
}class M4A1 extends Gun{ //具体产品 - M4A1shoot(){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();  // 生产Ak47console.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();   // 生产M4A1console.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.

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

转载于:https://www.cnblogs.com/brookshi/p/6505608.html

TypeScript设计模式之工厂相关推荐

  1. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  2. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  3. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  4. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  5. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  6. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  7. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  8. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  9. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

最新文章

  1. JS基础-Array对象手册
  2. adas--智能驾驶辅助系统
  3. 【PM模块】技术对象管理
  4. c c mySQL机票设计_期末课程设计之 c++操作mysql完成机票预订系统(vc 6.0配置mysql环境)...
  5. asp.net 文本框显示xml格式数据_Excel 办公小技巧,查找和替换数据,您值得拥有...
  6. Kafka 安装与部署(单机版)与kafkaDemo调试测试(包含JAVA Demo)
  7. Jfinal集成Spring
  8. 国网的“好管家”——业务可视化管理平台
  9. 三国演义人物出场统计代码含义_用python分析小说人物关系(二)——实战篇
  10. cognos安装教程linux,Cognos安装步骤Linux
  11. Reed-Solomon纠错码(RS码)(里德-所罗门码)
  12. ITIL Expert
  13. Kinova 之 mico刷机教程
  14. 几种常见的线程池及使用场景
  15. R数据分析:跟随top期刊手把手教你做一个临床预测模型
  16. UDT协议解析及C/C++代码实现
  17. EMC Unisphere客户端连接EMC
  18. 太平洋电脑网论坛关闭了
  19. 「国内招聘」软件工程师
  20. 1-2 四轴飞行器基本原理

热门文章

  1. C++11新特性(46)- allocator::construct可使用任意构造函数
  2. 使用Python生成直方图
  3. 线性回归(Linear Regression)
  4. 石头剪子布c语言课程设计,c语言课程设计报告石头剪子布.doc
  5. 计算机室走廊文化内容,教学楼走廊文化标语.pdf
  6. 数据科学导论学习小结——其一
  7. python aes 加盐 加密解密
  8. Java调用C++程序实现方法
  9. java用tabula解析pdf文件中的表格
  10. 计算机室管理制度英语,计算机室管理制度.doc