首页 > 编程语言 >Javascript:设计模式-简单工厂模式

Javascript:设计模式-简单工厂模式

时间:2022-08-25 10:16:44浏览次数:62  
标签:function console log Javascript 工厂 var 设计模式 name

工厂模式大体分为三类:简单工厂模式、工厂方法模式、抽象工厂模式。

在我们日常的实现功能逻辑中,最基础的一种方法是这样的:

有一个体育器材店,每一种类型的运动器材都有名称和简介。以篮球为例:

1 2 3 4 5 6 7 var Basketball = function () {   this.info='篮球'; } Basketball.prototype = {   getMem : function(){ console.log('每个队伍需要5个人') }   getSize: function(){console.log('篮球尺寸很大')} }
当你拿到一个球,你会看到这样的信息
1 2 3 4 var ball = new Basketball() ball.info //"篮球" ball.getMem() //每个队需要5个人 ball.getSize() //篮球尺寸很大

介于店里各种各样的商品,你看花了眼,每一个都得拿起来看,看完再放回去。(重复创建好多实例去执行代码实现你的需求)

原理:声明对象,后续给对象加属性和方法

优点:可以直观的看出对象Basketball有属性info,方法getMem、getSize;

缺点:如果有多个类型,需要创建多个实例;

 

这时候你会怎么想?是不是会想到 ,假如有个人能帮我拿多好! 这时候店铺老板刚好看到了你,急忙走过来问你:同学 想了解什么样的器材,我可以帮你呀。这下你就方便多了,每说出一个类型,老板就能快速的帮你找到这类器材。

 注意这里:你和老板的区别,你是一个一个去拿起来看,而老板则是自己的店铺,知道你要的类型的摆放在哪里,明显效率很多。

接着你就明白了,你不需要自己回忆那么多器材的特征,样式,尺寸,颜色等等。。 你只需要告诉老板 你要的器材叫什么名字,他就可以帮你找到!

类比到JavaScript中。这就是简单工厂模式

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 var Basketball = function () {   this.info='篮球'; } Basketball.prototype = {   getMem : function(){ console.log('每个队伍需要5个人') }   getSize: function(){console.log('篮球尺寸很大')} } var Football = function () {   this.info='足球'; } Football.prototype = {   getMem : function(){  console.log('每个队伍需要11个人') }   getSize: function(){console.log('足球尺寸很大')} } var Tennis= function () {   this.info='网球'; } Tennis.prototype = {   getMem : function(){ console.log('每个队伍需要1个人') }   getSize: function(){console.log('网球很大')} } //创建工厂类囊括上面的三种基类 var SportFactory= function(name){     switch(name){      case 'NBA':         return new Basketball();      case 'wordCup':         return new Football ();      case 'frenchOpen':         return new Tennis();     default:        throw new Error('没有您需要的器材')  } }

当你和小伙伴想踢球,只需要告诉店员你想买个球,使用这个工厂时仅需记住SportFactory这个工厂对象就好了。

 

1 2 3 4 5 6 var football = SportFactory('wordCup'); console.og(football); console.log(football.intro); football.getMem(); var basketball =  SportFactory('NBA'); var tennis =  SportFactory('frenchOpen');

优点:
可以免除直接创建产品对象实例的责任,而仅仅是“消费”产品。简单工厂模式通过这种做法实现了对责任的分割
缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则;
这种做法扩展性差,违背了开闭原则,也影响了可读性。
所以,这种方式使用在业务较简单,工厂类不会经常更改的情况。

 

简单工厂 模式===>工厂方法模式。

我来到一家书店买书,我要买编程类的书,分别是“JS高级编程,第三版,2013年出版”、“CSS世界,第一版,2017年出版”、“VUE权威指南,第一版,2018年出版”,我不用自己去找这些书,而是口头告诉给店员,让他帮我找,并且告诉我价格。

这时,店员就是这个简单工厂对象,而返回给我的书的信息以及价格则是这个产品的实例。:

function bookShop (name, year, vs) {   var book = new Object();   book.name = name;   book.year = year;   book.vs = vs;   book.price = '暂无标价';   if (name === 'JS高级编程') {     book.price = '79';   }   if (name === 'css世界') {     book.price = '69';   }   if (name === 'VUE权威指南') {     book.price = '89';   }   return book; } var book1 = bookShop('JS高级编程''2013''第三版'); var book2 = bookShop('ES6入门教程''2017''第六版'); var book3 = bookShop('css世界''2015''第一版'); console.log(book1) //{name: "JS高级编程", year: "2013", vs: "第三版", price: "79"} console.log(book2) //{name: "ES6入门教程", year: "2017", vs: "第六版", price: "暂无标价"} console.log(book3) //{name: "css世界", year: "2015", vs: "第一版", price: "69"}

工厂方法模式是对产品类的抽象,使其创建多类产品的实例。

上面简单工厂模式是创建同一类的某个产品,而这里的工厂方法模式是创建多类产品的实例,区别就出来了,它其实是将多个产品类进行抽象化,可以通过这个工厂对这些类创建相应类的实例。

比如现在,我不想买编程类的书了,我要买科学类或者社会学类的书,那么工厂方法模式的作用就体现出来了。

var BookShop = function (name) {   // 如果外部直接调用了BookShop而不是new关键字调用,则返回new BookShop调用,否则直接调用   // 这个产品类创建实例返给外部   if (this instanceof BookShop) {     var book = new this[name]()     return book   else {     return new BookShop(name)   } } BookShop.prototype = {   Programme: function () {     this.books = ['css世界''JS高级编程''ES6入门教程']   },   Science: function () {     this.books = ['人与自然''大自然的奥秘''走进科学']   },   Society: function () {     this.books = ['精神小伙修炼手册''摇花手''豆豆鞋']   } }   var programme = new BookShop('programme'); var science = BookShop('science'); var society = BookShop('society'); console.log(programme) // books: (3) ["css世界", "JS高级编程", "ES6入门教程"] console.log(science) // books: (3) ["人与自然", "大自然的奥秘", "走进科学"] console.log(society) // books: (3) ["精神小伙修炼手册", "摇花手", "豆豆鞋"]

 

标签:function,console,log,Javascript,工厂,var,设计模式,name
From: https://www.cnblogs.com/fqs123456/p/16623269.html

相关文章

  • Javascript:实现继承的几种方式
    既然要实现继承,那么首先我们得有一个父类,代码如下://定义一个动物类function Animal(name){  //属性  this.name=name|| 'Animal';  //实例......
  • Javascript:设计模式-代理模式
    例:该例为书中原例,小明(xiaoming)遇到了女神(A),打算送个花来告白,刚好小明打听到女神有个朋友叫(B),自己不太好意思,所以决定让B来送花,虽然这件事儿肯定是凉了,但是作为例子还是很......
  • 设计模式之组合模式
    本文通过老王和小王探讨书房、书架、各类书的管理问题,引出结构型设计模式家族中的一个重要成员——组合模式,本文会给予两种组合模式的典型代码实现,为了加深理解会在第三部......
  • 「中高级前端面试」JavaScript手写代码无敌秘籍
    手写路径导航实现一个new操作符实现一个JSON.stringify实现一个JSON.parse实现一个call或apply实现一个Function.bind实现一个继承实现一个JS函数柯里化手写一个......
  • 盒子模型、 浮动布局、定位属性、 z-index、JavaScript基础语法
    今日内容概要盒子模型浮动布局定位属性z-indexJavaScript基础语法今日内容详细盒子模型所有的标签都可以看成是一个快递盒1.外边距(margin):指标签之间的距离(......
  • 设计模式 23 访问者模式
    参考源https://www.bilibili.com/video/BV1u3411P7Na?p=31&vd_source=299f4bc123b19e7d6f66fefd8f124a03访问者模式(VisitorPattern)属于行为型模式概述生活中经常......
  • JavaScript知识-简介、语言规范、语言基础
    目录JavaScript简介1.ECMAScript和JavaScript的关系2.JavaScript语言3.HTML、CSS、JavaScriptJavaScript基础之语言规范1.如何使用?2.注释3.结束符JavaScript语言基础1.Java......
  • 设计模式 22 策略模式
    参考源https://www.bilibili.com/video/BV1u3411P7Na?p=30&vd_source=299f4bc123b19e7d6f66fefd8f124a03策略模式(StrategyPattern)属于行为型模式概述生活中会面......
  • 04.Javascript学习笔记3
    1.箭头函数箭头函数是一种更短的函数表达式。constage=birthyear=>2022-birthyear;console.log(age(2000))箭头左边的birthyear是参数,箭头右边是要执行的代码......
  • Iterator设计模式
    迭代器设计模式用集合类实现Aggregate接口,并实现其iterator方法,生成特定的迭代器对象,但返回时返回为Iterator类型,以此来抽象编程,实现解耦合的目的。类图:   当使用......