JS设计模式之工厂模式

工厂模式大体分为三类: 简单工厂模式工厂方法模式抽象工厂模式。三者之间的关系,也是渐进式的,抽象化的范围也是越来越高。

1. 简单工厂模式

同一类对象创建过程的抽象,在形式上它仅仅只是简单的通过 switch 等判断语句,根据不同条件去生成不同对象,且只能创建现有的数据,如果要添加,必须手动添加。

interface IPhone {name: string;price: number;
}enum Phones {hw,mi
}// 这里的 Shop 则表示一个工厂,它将数据包裹,根据需求提供数据。
class Shop {// 华为手机hwPhone:IPhone = {name: "mate 40",price: 4000,};// 小米手机miPhone:IPhone = {name: "p40",price: 4000,};getPhone(type: Phones): IPhone{switch (type) {case Phones.hw:return this.hwPhone;case Phones.mi:return this.miPhone;}}
}const shop1 = new Shop();
const mi1 = shop1.getPhone(Phones.mi);
mi1.name = "nihao";const shop2 = new Shop();
const mi2 = shop2.getPhone(Phones.mi);console.log(mi1, mi2);

2. 工厂方法模式

当数据量多时,简单工厂模式显而易见的的不适用,每增加一个项目就要手动添加,内容太多。而 工厂方法模式 则是对 简单工厂模式 的进一步优化,它对同一类对象进行抽象,通过 子类 去创建,从而达到精简代码的目的。

interface IPhone {name: string;price: number;
}
class Phone {name: string;price: number;constructor(name: string, price: number) {this.name = name;this.price = price;}
}class Shop {getPhone(name: string, price: number): IPhone{// 通过 子类 去实现数据的创建return new Phone(name, price);}
}const shop1 = new Shop();
const phone1 = shop1.getPhone("华为", 4500);const shop2 = new Shop();
const phone2 = shop2.getPhone("小米", 4000);console.log(phone1, phone2);

3. 抽象工厂模式

工厂方法模式 主要是作用与同一类产品,比如说:手机,而 抽象工厂模式 是对一产品簇的抽象,比如说, 小米有小米手机,小米笔记本…

// 手机的抽象类
abstract class Phone {name: string;price: number;constructor(name: string, price: number) {this.name = name;this.price = price;}abstract call(): void;
}// 笔记本的抽象类
abstract class Laptop {name: string;price: number;constructor(name: string, price: number) {this.name = name;this.price = price;}// 打游戏abstract game(gameName: string): void;
}/*** 小米本身作为一个产品簇,拥有手机,笔记本的多个品种,*  1. 先实现产品簇中的某个产品类;*  2. 在通过整个工厂,整合所有的产品*/
class MiPhone extends Phone {call() {console.log("少林功夫好哎");}
}class MiLaptop extends Laptop {game(gameName: string) {console.log(`小米电脑适合${gameName}`);}
}class Mi {getPhone(name: string, price: number) {return new MiPhone(name, price);}getLaptop(name: string, price: number) {return new MiLaptop(name, price);}
}class HuaweiPhone extends Phone {call() {console.log("少林功夫好哎");}
}/*** 华为效果类似 *
*/
class HuaweiLaptop extends Laptop {game(gameName: string) {console.log(`小米电脑适合${gameName}`);}
}class Huawei {getPhone(name: string, price: number) {return new HuaweiPhone(name, price);}getLaptop(name: string, price: number) {return new HuaweiLaptop(name, price);}
}const miShop = new Mi();
const miPhone = miShop.getLaptop("P40", 3600);
console.log(miPhone);const huaweiShop = new Huawei();
const huaweiPhone = huaweiShop.getLaptop("meta 40", 4000);
console.log(huaweiPhone);

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

  1. js设计模式抽象工厂模式

    抽象工厂模式(Abstract Factory) 通过类的抽象使得业务适用于一个产品类簇的创建,而不负责创建某一类产品的实例. JS中是没有直接的抽象类的,因此我们需要在类的方法中抛出错误来模拟抽象类 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  9. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  10. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

最新文章

  1. Fib(兔子问题)python实现多种方法
  2. oracle 无备份恢复数据文件
  3. HDU4472 Count
  4. matlab操作入门实验报告,matlab操作实验报告
  5. .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇
  6. 使用CLI扩展和重新平衡Couchbase集群
  7. 怎么用vc采集ni卡数据_8bit,200MS/s 低成本模拟输入高速采集卡FCFR-PCI9850
  8. ROS小白——knict相机标定(2)
  9. android104 帧动画,补间动画,属性动画
  10. Hadoop集群配置搭建
  11. 迅雷使用积分制的真正作用和目的   [揭密迅雷]
  12. 围观人类弹琴后,Facebook的AI学会了假装演奏
  13. 局域网共享设置软件_新页软件:如何设置局域网模式
  14. mysql数据基本指令_mysql数据库常用命令(详细)
  15. 绝地求生key钓鱼全套教程加源码
  16. 产品结构图、功能结构图、信息结构图,区别在这里
  17. DNF最新纯图色脚本框架2022-4-27
  18. 2022高压电工考试题库及模拟考试
  19. 深入计算机组成原理(二十七)SIMD:如何加速矩阵乘法
  20. 日常生活-不帮人投资理财

热门文章

  1. 《构建之法》第1.2.3章读后感 以及《硅谷传奇》观后感
  2. 基于推特数据挖掘交通事件的城市交通流深度学习预测模型
  3. TPC,TPCC,TPMC(计算机性能衡量指标)
  4. AE渲染加快速度,解决导出视频太慢的问题
  5. win7 蓝屏:stop 0x0000006b解决方法
  6. 微信 分享领券 php,微信卡券货架显示已领取
  7. 教你快速打粤语正字 讯飞输入法语音输入1分钟400字
  8. 注意力缺陷障碍可以通过​训练大脑来管理
  9. IPv4与IPv6的区别
  10. 数据总线,地址总线,存储容量计算题理解