首页 > 其他分享 >【JS设计模式笔记】给我一张名片-工厂方法模式(创建型)

【JS设计模式笔记】给我一张名片-工厂方法模式(创建型)

时间:2022-10-24 23:12:02浏览次数:57  
标签:function 名片 document JS content var div 设计模式 type

广告展现

例如,关于计算机培训广告资源需要投放,一批是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);
}

标签:function,名片,document,JS,content,var,div,设计模式,type
From: https://www.cnblogs.com/moqiutao/p/16782862.html

相关文章

  • js面向对象
    18面向对象概述:面向对象是一种编程思想(oop),面向对象相对于面向过程的一个抽取和简化。主要是以类来构建对象,以对象来存储对应的行为及属性,抽取对应的行为做为方法,抽取对......
  • d3.js 绘制Lollipop plot(棒棒糖图)
    棒棒糖图与普通的条形图功能相似。从图形上来看,棒棒糖图是由一条锚定在x轴或y轴上的线和点组成的。使用d3js绘制棒棒糖图很简单,因此这次为了学习d3js的一些方法,使用按......
  • jsp:useBean找不到类(xxx cannot be resolved to a type)
    解决使用的javaBean类必需放在具体的包下,而不能缺省放置例:如果我想使用TestBean类,就可以把它放入test包下(不能只放在src目录下,必需放在某个包中!!jsp中class如下设置:......
  • 本想搞清楚ESM和CJS模块的互相转换问题,没想到写完我的问题更多了
    本来只是好奇打包工具是如何转换ESM和CJS模块的,没想到带着这个问题阅读完编译的代码后,我的问题更多了。目前主流的有两种模块语法,一是Node.js专用的CJS,另一种是浏览器和N......
  • kubectl支持jsonpath
    官方:https://kubernetes.io/zh-cn/docs/reference/kubectl/jsonpath/给的JSon{"kind":"List","items":[{"kind":"None","metadata":{"name"......
  • 爬取js渲染或ajax加密的网页(万能方法)
    requests库Requests是Python的第三方库,它的安装非常简便,如下所示:python-mpipinstallrequestsRequests库是在urllib的基础上开发而来,它使用Python语言编写,并......
  • js里面的this指向
    在普通函数中,this指向window在定时器函数中,this指向window在对象函数中,this指向当前对象在事件函数中,this指向事件源在构造函数中,this指向实例化对象在数组对象中,this......
  • 设计模式总览
    设计模式是什么?在软件工程中,设计模式(DesignPattern)是对软件设计中常见问题的典型解决方案。它们就像能根据需求进行调整的预制蓝图,可用于解决代码中反复出现的设计问题。......
  • jmeter组件:JSON Extractor
    Namesofcreatedvariables:参数名JsonPathexpressions:json提取表达式MatchNo:匹配数字,0表示随机匹配DefaultValues:默认值,有几个参数就要写几个......
  • vue3 main.ts文件中引入js文件
    提示无法找到模块的申明文件解决步骤:在tsconfig.json文件中加入一个参数:allowJS"compilerOptions":{"target":"esnext","module":"esnext","stri......