JAVA SCRIPT设计模式--创建型设计模式之工厂方法(3)

news2024/11/16 7:56:02

        JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了解设计模式目录、原则、设计变化方向,环境相关等信息请查看设计模式开篇。


一、UML类图

参与者:

1.1 Product(Document)

  • 定义工厂方法所创建的对象的接口。

1.2 ConcreteProduct(MyDocument)

  • 实现Product接口。

1.3 Creator(Application)

  • 声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
  • 可以调用工厂方法以创建一个Product对象。

1.4 ConcreteCreator(MyApplication)

  • 重定义工厂方法以返回一个ConcreteProduct实例。

二、意图

        定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。

三、适用性

  1. 当一个类不知道它所必须创建的对象的类的时候。
  2. 当一个类希望由它的子类来指定它所创建的对象的时候
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类 是代理者这一信息局部化的时候

四、示例代码

4.1  动机

      框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。考虑这样一个应用框架,它可以向用户显示多个文档。在这个框架中,两个主要的抽象是类Application和Document。这两个类都是抽象的,客户必须通过它们的子类来做与具体应用相关的实现。例如,为创建一个绘图应用,我们定义类DrawingApplication和DrawingDocument。Application类负责管理Document并根据需要创建它们—例如,当用户从菜单中选择Open或New的时候。

        因为被实例化的特定Document子类是与特定应用相关的,所以Application类不可能预测到哪个Document子类将被实例化—Application类仅知道一个新的文档何时应被创建,而不知道哪一种Document将被创建。这就产生了一个尴尬的局面:框架必须实例化类,但是它只知道不能被实例化的抽象类。

        工厂方法模式提供了一个解决办案。它封装了哪一个Document子类将被创建的信息并将这些信息从该框架中分离出来,如下页上图所示。Application的子类重定义Application的抽象操作CreateDocument以返回适当的Document子类对象。一旦一个Application子类实例化以后,它就可以实例化与应用相关的文档,而无需知道这些文档的类。我们称CreateDocument是一个工厂方法(factorymethod),因为它负责“生产”一个对象。

4.2  示例UML

目录结构:

4.3 Product(Document)

  • 定义工厂方法所创建的对象的接口。
export default  class Document {
	
    constructor() {
    }
    Open() {     
    }
    Close() {     
    }
	Save() {
	}
	Revert() {
	}
  }

4.4 ConcreteProduct(MyDocument)

  • 实现Product接口。
import Document  from '../Document.js';

export default  class MyDocument extends Document {
    constructor() {
		 super();
    }
    Open() {  
		 console.log(` MyDocument Open `);
    }
    Close() {     
		 console.log(` MyDocument Close `);
    }
	Save() {
		 console.log(` MyDocument Save `);
	}
	Revert() {
		 console.log(` MyDocument Revert `);
	}
  } 

import Document  from '../Document.js';

export default  class WordDocument extends Document {
    constructor() {
		 super();
    }
    Open() {  
		 console.log(` WordDocument Open `);
    }
    Close() {     
		 console.log(` WordDocument Close `);
    }
	Save() {
		 console.log(` WordDocument Save `);
	}
	Revert() {
		 console.log(` WordDocument Revert `);
	}
  } 

4.5 Creator(Application)

  • 声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
  • 可以调用工厂方法以创建一个Product对象
import Document from '../Document/Document.js';

export default  class Application  {
	#docs=[]; 
    constructor() {
    }
    CreateDocument() {  
		 console.log(` Application CreateDocument `);
    }
    NewDocument() { 
		 console.log(` Application NewDocument `);
		 let doc=this.CreateDocument();//Document
		 this.#docs.push(doc);
		 doc.Open();
		 return doc;
    }
	OpenDocument() {
		 console.log(` Application OpenDocument `);
	}
	 
  } 

4.6 ConcreteCreator(MyApplication)

  • 重定义工厂方法以返回一个ConcreteProduct实例。
import Application  from '../Application.js';
import MyDocument  from '../../Document/impl/MyDocument.js';

export default  class MyApplication extends Application  {
	
    constructor() {
		super();
    }
    CreateDocument() {
		 let myDoc=new MyDocument();
    	 console.log(` MyApplication CreateDocument `);
		 return myDoc;
    }
  } 
import Application  from '../Application.js'; 
import WordDocument  from '../../Document/impl/WordDocument.js';
export default  class WordApplication extends Application  {
	
    constructor() {
		super();
    }
    CreateDocument() {
		 let wordDoc=new WordDocument();
    	 console.log(` MyApplication CreateDocument `);
		 return wordDoc;
    }
  } 

4.7 Client 

import MyApplication  from './Application/impl/MyApplication.js';
import WordApplication  from './Application/impl/WordApplication.js';
import Document  from './Document/Document.js';
 
export default class Client{
    main(){
	    let application =new MyApplication();//Application
		let doc=application.NewDocument();//Document
		doc.Close(); 
		let wordapplication =new WordApplication();//Application
		let word=wordapplication.NewDocument();//Document
		word.Close(); 
		
    } 
 }

4.8 测试HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 
 
 <script  type="module" >
 import Client  from './Client.js'; 
 
let cl=new Client();
cl.main()

 </script>
</head>
<body>

    
</body>
</html>

测试结果:

Application.js:11  Application NewDocument 
MyApplication.js:11  MyApplication CreateDocument 
MyDocument.js:8  MyDocument Open 
MyDocument.js:11  MyDocument Close 
Application.js:11  Application NewDocument 
WordApplication.js:10  MyApplication CreateDocument 
WordDocument.js:8  WordDocument Open 
WordDocument.js:11  WordDocument Close 

五、源代码下载

        下载链接:https://pan.baidu.com/s/1XuPqp84cccBNVkbnMY3sKw 
         提取码:q2ut

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记之配分函数(三)对比散度

机器学习笔记之配分函数——对比散度引言回顾&#xff1a;随机最大似然求解模型参数的过程随机最大似然的缺陷吉布斯采样的缺陷与对比散度思想对比散度名称的由来从KL\mathcal K\mathcal LKL散度的角度描述极大似然估计对比散度的本质引言 上一节介绍了随机最大似然(Stochasti…

第十四届蓝桥杯集训——JavaC组第四篇——ASCII码表与Scanner扫描器

第十四届蓝桥杯集训——JavaC组第四篇——ASCII码表与Scanner扫描器 目录 第十四届蓝桥杯集训——JavaC组第四篇——ASCII码表与Scanner扫描器 ASCII码表 Scanner扫描器 1、Scanner含义 2、使用方法&#xff1a; next和nextLine的区别 next&#xff1a; nextLine&#…

微服务框架 SpringCloud微服务架构 23 搜索结果处理 23.2 分页

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构23 搜索结果处理23.2 分页23.2.1 分页23.2.2 深度分页问题23.2.3 深度分页…

Zookeeper常用命令大全之四字监控命令

文章目录四字监控命令0. 官方文档1. conf命令2. cons命令3. crst命令4. dump命令5. envi命令6. ruok命令7. stat命令8. srst命令9. wchs命令10. wchc命令(一般不用)11. wchp命令(一般不用)12. mntr命令四字监控命令 zookeeper支持某些特定的四字命令与其的交互。它们大多是查询…

自媒体短视频,如何起一个让人一看就记住的昵称?看一眼就知道你的定位

上一篇我们说了头像如何设置更吸引人&#xff0c;今天上午在我赢且力手小禾呈序里聊了一个好听好记的昵称应该是怎样的&#xff1f; 这是文字版&#xff0c;大家可以看一看。 昵称起名的方式无非几种&#xff1a; 职业加昵称&#xff0c;昵称加地点&#xff0c;昵称加领域&a…

全球数据集大全之mavenanalytics学习分析世界杯数据集

mavenanalytics数据集平台介绍 探索和下载由 Maven 讲师精心挑选的示例数据集。练习将您的数据分析和可视化技能应用于现实世界的数据,从航班延误和电影收视率到鲨鱼袭击和不明飞行物目击事件。 平台效果 是否支持下载 可以免费下载 https://www.mavenanalytics.io/data-p…

Java基于jsp大学生收支管理系统

随着计算机技术的飞速发展&#xff0c;计算机在系统管理中的应用越来越普及&#xff0c;利用计算机实现各个系统的管理显得越来越重要。随着人们消费水平的提高&#xff0c;消费量一直在加大 &#xff0c;可是如何能够合理的管理和记录自己的消费方向是一个很大的问题&#xff…

深度学习炼丹-不平衡样本的处理

前言一&#xff0c;数据层面处理方法 1.1&#xff0c;数据扩充1.2&#xff0c;数据&#xff08;重&#xff09;采样 数据采样方法总结 1.3&#xff0c;类别平衡采样 二&#xff0c;算法&#xff08;损失函数&#xff09;层面处理方法 2.1&#xff0c;Focal Loss2.2&#xff0c;…

Akka 学习(三)Actor的基本使用

目录一 基本案例1.1 Java 版1.2 Scala版二 Actor的创建2.1 ActorRef2.2 Props2.3 ActorSelection三 Promise、Future和事件驱动的编程模型3.1 阻塞与事件驱动3.2 Future进行Actor响应3.2.1 Java版3.2.2 Scala 版3.2.3 总结3.3 成功处理3.4 失败处理3.5 恢复3.6 链式调用3.7 结果…

小程序开发工具怎么使用?

小程序开发工具怎么用&#xff1f; 小程序开发工具分两种: 一种是微信官方提供的微信开发者工具 这个需要从事代码行业&#xff0c;职业是程序员又或者对代码知识有一定程度的人&#xff0c;才能上手使用。 另一种是第三方小程序开发平台&#xff0c;提供的小程序开发工具 …

python环境、基础语法、几种常见的数据类型

文章目录前言一、基本知识介绍二、举例实操以及重要知识再现(列表、元组、集合、字典)前言 一、基本知识介绍 python基础 标准库与扩展库中的对象的导入与使用&#xff1a; import 模块名&#xff08;as别名&#xff09; import numpy as np from 模块名 import 对象名&#x…

程序人生:快来一起学习软件测试,一起月薪过万(测试理论基础学习)

测试基础 为什么要有测试呢&#xff1f;现在软件已经和人的生活息息相关了&#xff0c;所以保证软件的稳定很重要。但是所有开发出来的软件都是有缺陷的。包括代码错误&#xff0c;逻辑错误&#xff0c;设计不合理等。 测试的目的 测试的目的主要有四个点 1找到软件缺陷 2…

Flink SQL增量查询Hudi表

前言 前面总结了Spark SQL增量查询Hudi表和Hive增量查询Hudi表。最近项目上也有Flink SQL增量查询Hudi表的需求&#xff0c;正好学习总结一下。 官网文档 地址&#xff1a;https://hudi.apache.org/cn/docs/querying_data#incremental-query 参数 read.start-commit 增量查…

WWW2022 | 基于领域增强的图对比协同过滤方法+代码实践

嘿&#xff0c;记得给“机器学习与推荐算法”添加星标今天跟大家分享一篇将对比学习应用于图协同过滤方法的文章&#xff0c;该论文发表于WWW2022会议上。其主要思想是在图神经网络协同过滤方法上应用了两种领域类型的对比学习方法&#xff0c;分别是显式的结构领域和隐式的语义…

TGK-Planner-前后端路径规划(基于梯度的后端无约束优化)

高速移动无人机的在线路径规划一直是学界当前研究的难点&#xff0c;引起了大量机器人行业的研究人员与工程师的关注。然而无人机的计算资源有限&#xff0c;要在短时间内规划出一条安全可执行的路径&#xff0c;这就要求无人机的运动规划算法必须轻型而有效。本文将介绍一种无…

electron-vue中报错 Cannot use import statement outside a module解决方案(亲测有效!!!)

错误&#xff1a; Cannot use import statement outside a module(不能在模块之外使用导入语句)。 原因&#xff1a; 安装的某个依赖包里使用了import语法&#xff0c;因为我们打包输出的是commonjs规范&#xff0c;所以不识别import语法而导致报错。 可以从 .electron-vue/w…

PrimoBurnerSDK蓝光刻录工具开发工具包

PrimoBurnerSDK蓝光刻录工具开发工具包 PrimoBurnerSDK是一个CD、DVD和蓝光刻录工具开发工具包。它还提供了一个全面灵活的API&#xff0c;用于快速轻松地实现各种燃烧/翻录替代方案。 PrimoBurner SDK for.NET的强大功能&#xff1a; 自2003年以来一直在发展的广泛使用的老式发…

比机器人还智能的数字孪生地下停车场监管系统!

现在的停车场管理大多采用人工或智能收费系统&#xff0c;两种方式都有一个弊端就是无法直接知晓停车场内部信息。 车驶入停车场只能自行寻找停车位&#xff0c;工作人员也只有走进停车场才能知晓停车场内部情况&#xff0c;无可避免造成很多麻烦。 停车场智慧监管系统结合数…

期货开户交易操作技巧

期货交易的时候需要有一些操作技巧&#xff0c;以及要注意一些操作上常见的错误。 个人建议刚刚开始交易的投资者期货交易的投资者&#xff0c;一定要多看慢做&#xff0c;首先要摒弃做这个会一夜暴富的想法。抱着个想法来的往往都会折戟沉沙&#xff0c;一去不复返了。所以我…

基于springboot+mybatis+mysql+vue中学生成绩管理系统

基于springbootmybatismysqlvue中学生成绩管理系统一、系统介绍二、功能展示1.登陆2.用户管理(管理员)3.班主任信息管理(管理员)4.教师信息管理&#xff08;管理员、班主任&#xff09;5.学生信息管理&#xff08;管理员&#xff09;6.成绩信息管理&#xff08;管理员、班主任、…