简单工厂模式(Simple Factory):又叫静态工厂方法:由一个工厂对象决定创建某一产品对象的实例。主要用来创建同一类对象。

小白经过几天对团队代码的学习,终于对面向对象思想有所认识,自己跳动的小心脏跃跃欲试,信心满满准备大显身手。。。

工作中的第一次需求

“小白,这几天学习的怎么样了?登录模块的需求你能来处理一下么?”项目经理问。

“没问题。”小白答道。

“不过用户名输入框这里如果用户输入的内容不符合规范就自定义个瞀示框警示一句‘用户名不能多于16个字母或数字’。”

“好的 。” 于是小白简筒单单写下了一个警示框类。

var LoginAlert= function(text){this.content= text;
}LoginAlert.prototype.show = function (){//显示警告框
}var userNameAlert = new LoginAlert('用户名不能超过16个字母或数字');
userNameAlert.show();

“关于用户输入的密码也有一个需求, 就是当用户输入的密码错误时也提示一句’输入的密码不正确’ 的提示文案吧。”

“没同题,”小白心中暗喜,“面向对象编程就是好用,这不刚写完的类,这么快就用上了,小case。”

var passwordAlert = new LoginAlert('输入密码不正确');
passwordAlert.show();

“小白, 用户登录时如果用户名不存在你提示一句’您的用户名不存在, 请重新输入’”

“没问题”,小白心中暗喜。

“不过这里有些变化,就是要在警示框中添加一个注册按钮”。

“添加一个按钮……”,小自傻眼了,心想,“以前的功能这可怎么复用呀,唉,又得创建一个类了。”

var loginConfirm = function(text){this.content = text;
}
loginConfirm.prototype.show = function(){//显示确认框
}var loginFailConfirm = new LoginConfirm('您的用户名不存在,请重新输入');
loginFailConfirm.show();

“小白, 登录成功后给出一个自定义提示框,除了有确定取消按钮, 也提示一句’欢迎回来,请输入您今天的心情吧’ 。

“这又是一个新类……”小白感叹道。于是只好添加一个类。

var LoginPrompt = function(text){this.content = text;
}
LoginPrompt.prototype.show = function(){//显示提示框
}

利用了大半天时间, 小白终于把这些需求写完了 。

“小铭, 注册模块你来做吧,当用户输入的新用户名规范不正确的时候提示’用户名不能多于l6个字母或数字’,当用户输入的两次密码不正确时提示’您两次输入的密码不统一,请重新输入’,当用户的邮箱不规范时提示……”项目经理吩咐着小铭余下的工作。

“项目经理, 登录模块谁做的,里面是不是也有提示框之类的需求呀? ”小铭同项目经理。

“小白负责的, 不过他那里的情况要比这还多几种 。”

“好的,”于是小铭来找小白, “小白, 你写了登录模块吧, 把你写的方法借我用一下”。

“好呀, 我是通过对类实例化对象实现的。”小白回应说。

“那太好了, 我这边就可以无缝使用了, 快给我。”

如果类太多,那么提供一个

于是小白将 LoginAlert、LoginConfirm、LoginPrompt 3个类告诉了小铭。

“怎么这么多?还是以Login为前缀,这样吧,你写个简单工厂给我吧。”

“简单工厂?这是什么?”小白好奇地问。

“这是一种模式呀,我的意思是说你给我3个类,在每次创建时还要找到对应的类,太麻烦了,而且在注册(regist)模块用你的login前缀也不太好,所以你最好封装在一个函数里,这样我只需要记住这个函数,然后通过这个函数就可以创建我需要的对象为我所用岂不是更好么? 这样不但是我, 而且其他人都不用再关注创建这些对象到底依赖于哪个基类了,而我们知道这个函数就可以了。这个函数通常也被称为工厂函数,这种模式叫简单工厂模式,它是工厂模式中最简单的一种形式。你看它很像一个会变戏法的魔术师, 你想要魔术师为你变的礼物,不过你不需要知道魔术师是用什么变的,你只需要知道有这位魔术师就行,然后找他就能帮你得到你想要的东西。

“原来是这样,可是我该如何改呢?”

“举个例子,比如说体育商品店卖体育器材,里面有很多体育用品,及其相关介绍等。当你来到体育用品店买一个篮球及其相关介绍时,你只需要问售货员,他会帮你找到你所要的东西。

//篮球基类
var Basketball = function(){this.intro = '篮球盛行于美国';
}
Basketball.prototype = {getMember : function(){console.log('每个队伍需要5名队员');},getBallSize : function(){console.log('篮球很大');}
}//足球基类
var Football = function(){this.intro = '足球在世界范围内很流行';
}
Football.prototype = {getMember : function(){console.log('每个队伍需要11名队员');},getBallSize : function(){console.log('足球很大');}
}//网球基类
var Tennis = function(){this.intro = '每年有很多网球系列比赛';
}
Tennis.prototype = {getMember : function(){console.log('每个队伍需要1名队员');},getBallSize : function(){console.log('网球很大');}
}//运动工厂
var SportsFactory = function(name){Switch(name){case 'NBA':return new Basketball();case 'wordCup':return new Football();case 'FrechOpen':return new Tennis();}
}

“当你想和小伙伴踢足球,只需要告诉店员我要买个足球即可。你使用这个商店工厂时仅仅需要记住SportsFactory这个工厂对象就好了。这个工厂魔术师会帮你找到你需要的-切。”

//为世界杯创建一个足球,只需要记住运动工厂SportsFactory,调用并创建
var football = SportsFactory('wordCup');
console.log(football);
console.log(football.intro);
football.getMember();

“很简单! 好了,去把你的代码改-下吧,别忘了告诉我你创建的那位 ‘魔术师’。”

很快小白就把自定义弹框这位“魔术师”请来了。

var PopFactory = function(name){switch(name){case 'alert':return new LoginAlert();case 'confirm':return new LoginConfirm();case 'prompt':return new LoginPrompt();}
}

“很不错!”小铭夸道0然后又看了看小白之前写的LoginAlert、 Loginconfirm、Loginprompt 3个类,皱了-下眉头,说:“这3个类有很多地方是相同的,是可以抽象提取出来共用的,你也可以用简单工厂的方式实现他们。”

一个对象有时也可代替许多类

“这怎么实现? 还是跟上面一样的结构? ” 小白很惊讶。

“不太一样,详细跟你说一下吧,简单工厂模式的理念就是创建对象,像上面那种方式是对不同的类实例化,不过除此之外简单工厂模式还可以用来创建相似对象。而你创建的这3个类(对象)很多地方都比较相似,比如都有关闭按钮,都有提示文案等。所以你可以通过将这些相似东西提取, 不相似的针对性处理即可。这有点类似我们之前学习继承时的寄生模式,很像,但是又不太-样,因为这里没有父类, 所以无需做任何继承,你只需简单创建一个对象即可, 然后通过对这个对象大量拓展方法和属性,并在最终将对象返回出来。”

“举个例子,比如你想创建一些书,那么这些书都有一些相似的地方,比如目录、页码等。也有一些不相似的地方,如书名、出版时间、书的类型等,对于创建的对象相似的属性好处理, 对于不同的属性就要有针对性地进行处理了,比如我们将不同的属性作为参数传递进来处理。”

//工厂模式
function createBook(name, time, type){//创建一个对象,并对对象拓展属性和方法var o=new Object();o.name = name;o.time = time;o.type = type;o.getName = function(){console.log(this.name);};//将对象返回return o;
}var book1 = createBook("js book", 2014, "js");
var book2 = createBook("css book", 2013, "css");book1.getName();
book2.getName();

“真的很像寄生式继承,只不过这里的o没有继承任何类或对象。”

“所以你这3个类要改成一个工厂模式也就很简单了,首先抽象他们的相同点,比如共有属性this.content,原型公有方法show,当然也有不同点,比如确认框和提示框的确定按钮,比如提示框的用户输入框等等,所以你就可以像下面这样创建了。”

function createPop(type, text){//创建一个对象,并对对象拓展属性和方法var o = new Object();o.content = text;o.show = function(){//显示方法};if(type == 'alert'){//警示框差异部分}if(type == 'prompt'){//提示框差异部分}if(type == 'confirm'){//确认框差异部分}//将对象返回return o;
}var userNameAlert = createPop('alert', '用户名只能是26个字母和数字');

你的理解决定你的选择方式

“但是这两个‘魔术师’工厂还是有一定区别的,好好想一想,你知道是什么吗?”小铭问。

“第一种是通过类实例化对象创建的,第二种是通过创建一个新对象然后包装增强其属性和功能来实现的。他们之间的差异性也造成前面通过类创建的对象,如果这些类继承同一父类,那么他们的父类原型上的方法是可以共用的。而后面寄生方式创建的对象都是一个新的个体,所以他们的方法就不能共用了。当然选择哪种工厂方式来实现你的需求还要看你是如何分析你的需求的。”

回忆

团队项日开发不同于个人开发,其对全局变量的限制很大, 所以我们要尽量少地创建全局变量。对于同一类对象在不同需求中的重复性使用, 很多时候不需要重复创建, 代码复用是面向对象编程的一条准则。通过对简单工厂来创建一些对象,可以让这些对象共用一些资源而又私有一些资源, 这是一种很不错的实践。不过对于简单工厂模式, 它的使用场合通常也就限制在创建单一对象。

神奇的魔术师——简单工厂模式相关推荐

  1. 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)

    简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1  场景问题 ...

  2. 设计模式之简单工厂模式

    一.概述 工厂模式具体包括了简单工厂.工厂方法.抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF的23中模式.   但是它是理解其它的工厂模式的一个很好 ...

  3. 设计模式 之美 -- 简单工厂模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现 C++实现: C语言实现 4. 缺点 1. 解决问题 举例如下: 我们实现一个卖衣服的功能,衣服的种类有很多:帽子,裤子,T恤... 每卖一种衣服 ...

  4. 设计模式之简单工厂模式(Simply Factory)摘录

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种 ...

  5. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前, ...

  6. 《JAVA与模式》之简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...

  7. 简单工厂模式(StaticFactoryMethod)

    来华北电力大学数理系LSGO软件技术团队学习Coding,我通常第一个就讲"简单工厂模式",这一讲不仅仅是讲模式,更主要的是让大家体会什么是软件系统的"可复用" ...

  8. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  9. java工厂模式 uml_简单工厂模式的UML类图与源码实现(转) | 学步园

    简单工厂模式的UML图 源码:Operation类 Java代码 packageOperation; publicabstractclassOperation { doublenumberA=0; d ...

最新文章

  1. JAVA基础——编程练习(一)
  2. JAVA实现判断树的子结构及树的镜像问题(《剑指offer》)
  3. 是时候给2020年做个总结了
  4. 限制域用户多点登录--脚本
  5. 如果城里人拿100万买你的农村宅基地,你愿意吗?
  6. splunk中 如何隐藏input_翻糖制作中,如何避免裂缝,如何隐藏裂缝,如何防粘?...
  7. override和overload
  8. Css3旋转、位移、缩放、倾斜动画
  9. 数据的统计分析与描述
  10. OpenStack版本比较之Keystone
  11. DEA for mac 热部署
  12. 笔记 黑马程序员C++教程从0到1入门编程——核心编程
  13. 计量经济学计算机答案第三章课后答案,庞皓计量经济学第2版课后习题答案
  14. 产品经理学习——卡诺模型
  15. 伴随矩阵例题_§6伴随矩阵及练习题.ppt
  16. 802.11ac中的Beamforming技术(4)
  17. 苹果服务器怎么配置文件,苹果CMS数据库配置文件在哪
  18. 7-8 哈利·波特的考试,7-9 旅游规划,7-10 公路村村通
  19. 这4种领导能力,别等变革失败了才知道!
  20. 【数据结构】链表 - Go 语言实现

热门文章

  1. 感悟生活,我们的创造力去哪了?谈谈我们的教育
  2. 发布Windows应用程序!试试英伟达“神笔马良”GauGAN
  3. springmvc中Model的理解
  4. Hadoop学习与使用
  5. 物流基础知识(十七)
  6. 为什么下载了SQL Server却没有sql配置管理器
  7. 独数游戏android程序,Android 数独小游戏
  8. 2021年05月软件设计师真题透析
  9. 谷歌面试题:男孩多还是女孩多?
  10. ByVal 和ByRef区别