【JS设计模式笔记】给我一张名片-工厂方法模式(创建型)
广告展现
例如,关于计算机培训广告资源需要投放,一批是Java的用绿色字体,一批是PHP的,用黄色字体,红色背景。
// 创建Java学科类
var Java = function (content) {
// 将内容保存在content里面以备后面使用
this.content = content;
(function(content){
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'green';
document.getElementById('container').appendChild(div);
})(content);
}
// 创建PHP学科类
var Php = function(content) {
this.content = content;
(function(content){
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'yellow';
div.style.background = 'red';
document.getElementById('container').appendChild(div);
})(content);
}
刚写完,又来了一批广告,关于JavaScript的,要求背景色是粉色的,于是用简单工厂模式来实现。
// 创建Java学科类
var Java = function (content) {
// 将内容保存在content里面以备后面使用
this.content = content;
(function(content){
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'green';
document.getElementById('container').appendChild(div);
})(content);
}
// 创建PHP学科类
var Php = function(content) {
this.content = content;
(function(content){
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'yellow';
div.style.background = 'red';
document.getElementById('container').appendChild(div);
})(content);
}
// 创建javascript学科类
var Javascript = function(content) {
this.content = content;
(function(content){
var div = document.createElement('div');
div.innerHTML = content;
div.style.background = 'pink';
document.getElementById('container').appendChild(div);
})(content);
}
// 学科类工厂
function Jobfactory(type,content) {
switch(type) {
case 'java':
return new Java(content);
case 'php':
return new Php(content);
case 'Javascript':
return new Javascript(content);
}
}
// 测试示例
new Jobfactory('Javascript','javascript哪家强!')
刚写完不久,又来了一批广告,UI学科的,需要红色边框.... 沉默了....
方案的择决
现在我发现,只要每次新来一批广告 ,我除了要添加类,还要修改工厂函数,这个时候工厂方法模式就出现了。我们可以将工厂方法看做是一个实例化对象的工厂类。安全起见,采用安全模式类。
安全模式类
安全模式类解决如下示例问题:
var Demo = function() {}
Demo.prototype = {
show: function() {
console.log('成功获取');
}
}
var d = new Demo();
d.show(); // 成功获取
var d2 = Demo();
d2.show(); // Uncaught TypeError: Cannot read properties of undefined (reading 'show')
为了避免出现上述问题,我们在构造函数开始执行时候,先判断当前对象this指代的是不是类(Demo),我们永生instanceof判断。
var Demo = function() {
if(!(this instanceof Demo)) {
return new Demo();
}
}
Demo.prototype = {
show: function() {
console.log('成功获取');
}
}
var d = new Demo();
d.show(); // 成功获取
var d2 = Demo();
d2.show(); // 成功获取
有了安全模式,我们就可以把这种技术应用到工厂方法中。
安全的工厂方法
// 安全模式创建的工厂类
var Factory = function(type,content) {
if(this instanceof Factory) {
return new this[type](content);
} else {
return new Factory(type,content);
}
}
// 工厂原型中设置创建所有类型数据对象的基类
Factory.prototype = {
Java: function(content) {
},
php: function(content) {
},
Javascript: function(content) {
},
UI: function(content) {
this.content = content;
(function(content){
var div = document.createElement('div');
div.innerHTML = content;
div.style.border = '1px solid red';
document.getElementById('container').appendChild(div);
})(content);
}
}
// 示例
Factory('UI','UI哪家强')
这样如果我们后面想其他其他类,只需要写在Factory这个工厂类的原型里面就可以了。
这就好比你在Factory类的原型上注册了一张名片,以后需要哪个类,只需要拿着这张名片,查找上面的信息就能找到这个类了。所有就不用担心使用的时候到不到基类了。
我们也可以这样使用:
// 示例
var data = [
{type: 'Javascript',content: 'Javascript哪家强'},
{type: 'Javascript',content: 'Javascript哪家强'},
{type: 'php',content: 'php哪家强'},
{type: 'UI',content: 'UI哪家强'},
{type: 'UI',content: 'UI哪家强'}
]
for(var i = 0; i < data.length; i++) {
Factory(data[i].type,data[i].content);
}
【JS设计模式笔记】给我一张名片-工厂方法模式(创建型)的更多相关文章
- C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)
动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...
- 设计模式(3)--FactoryMethod( [2] 工厂方法模式)--创建型
1.模式定义: 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 2.模式特点: (1)工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承. (2 ...
- Java设计模式从精通到入门五 抽象工厂方法模式
定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
- 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)
上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- C#设计模式学习笔记:(2)工厂方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...
- 【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念
注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple F ...
- Android设计模式系列--工厂方法模式
工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具 ...
随机推荐
- SurveillanceStation破解版 SurveillanceStation-x86_64-8.2.2-5766
直接手动安装好套件,许可就是65535.安装的时候提示套件损坏,不理继续安装.不过这个版本有时间炸弹问题,使用几个小时后会出现摄像机消失问题,显示摄像机被删除,但是配置其实是在的.只要禁用套件再启用一 ...
- docker-compose创建haproxy教程
本文主要讲解通过docker-compose创建haproxy并进行代理 一.haproxy简介 HAProxy是一款基于事件驱动.单进程模型设计的四层与七层负载均衡器,它能够在TCP/UDP层面以及 ...
- Vscode连接虚拟机报错
Vscode 连接虚拟机报错问题解决 问题解释 Permission denied, please try again.出现这个问题通常表示身份验证失败. 可能的原因有 SSH用户密码错误 SSH端口 ...
- ComfyUI进阶篇:ControlNet核心节点
前言: ControlNet_aux库包含大量的图片预处理节点,功能丰富,适用于图像分割.边缘检测.姿势检测.深度图处理等多种预处理方式.掌握这些节点的使用是利用ControlNet的关键,本篇文章将 ...
- [oeasy]python0074_修改字体背景颜色_background_color_背景色
修改背景色 回忆上次内容 上次将asciiart和颜色一起来玩 7 种基本色 变化多端 不过到目前为止 改的 都是前景色 背景色可以修改吗? 重温参数 具体动手试试 print("\033[ ...
- [UE] 关于ue5中制作流日志记录
UE5目前根据现有功能,配合Quixel Bridge可以做到地编和一些简单的动画,实现完整的游戏,但是目前随着版本的迭代,流程的定制需要更新 ControlRig方便在UE中做动画的,模拟动画等,U ...
- “Vanilla” 在计算机科学和技术领域中的专业翻译
"Vanilla" 在计算机科学和技术领域中通常指的是某个系统或软件的"原始"或"基础"版本,即没有任何修改.扩展或定制的版本.它可以翻译为 ...
- 计算机网络中的Ad hoc network到底是个啥?
"Ad hoc network" 是一种临时网络,通常指由一组设备(如计算机.手机等)通过无线方式相互连接而不需要依赖固定的基础设施(如路由器或交换机).这些网络通常是自组织的,能 ...
- 使用GPU计算时,单精度float32类型和半精度float16类型运算效率的区别
最近在看资料时发现写着使用float16 半精度类型的数据计算速度要比float32的单精度类型数据计算要快,因为以前没有考虑过数据类型对计算速度的影响,只知道这个会影响最终的计算结果精度.于是,好奇 ...
- Apache DolphinScheduler 3.1.8 版本发布,修复 SeaTunnel 相关 Bug
近日,Apache DolphinScheduler 发布了 3.1.8 版本.此版本主要基于 3.1.7 版本进行了 bug 修复,共计修复 16 个 bug, 1 个 doc, 2 个 chore ...