JAVA SCRIPT设计模式--创建型设计模式之抽象工厂(1)

news2024/11/13 21:21:04

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


一、UML类图

参与者:

1.1 AbstractFactory

        声明一个创建抽象产品对象的操作接口。

1.2 ConcreteFactory

        实现创建具体产品对象的操作。

1.3 AbstractProduct

        为一类产品对象声明一个接口。

1.4 ConcreteProduct  

        定义一个将被相应的具体工厂创建的产品对象。

1.5 Client 

        仅使用由AbstractFactory和AbstractProduct类声明的接口。
 

二、场景、意图

        提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

三、适用性

  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  •  当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  •  当你提供一个产品类库,而只想显示它们的接口而不是实现时。

四、有点和缺点

  • 它分离了具体的类AbstractFactory模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
  • 它使得易于交换产品系列一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。在我们的用户界面的例子中,我们仅需转换到相应的工厂对象并重新创建接口,就可实现从Motif窗口组件转换为PresentationManager窗口组件。
  • 它有利于产品的一致性当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。
  • 难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品。这是因为AbstractFactory接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,这将涉及AbstractFactory类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决办法。

五、示例代码

5.1  动机

        考虑一个支持多种视感(look-and-feel)标准的用户界面工具包,例如Motif(Motif 诞生于 1980 年代 Unix 工作站崛起的时代,由 DEC 和惠普等公司联合开发作为 X Window System 的一个通用的用户界面工具箱,后成为 Common Desktop Environment(CDE)桌面环境的基础构件。)和 Mac(Macintosh(简称Mac)是苹果公司自1984年起开发的个人消费型计算机,包含如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro等计算机。使用独立的macOS系统,最新的macOS系列基于NeXT系统开发,不支持兼容。是一套完备而独立的操作系统。) 。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。

5.2  示例UML

目录结构:

5.3 AbstractFactory(WidgetFactory)

        此处的抽象工厂是WidgetFactory类:

import scrollBar  from '../ScrollBar/ScrollBar.js';
import  Window  from '../Window/Window.js';


export default  class WidgetFactory {
    scrollBar=new scrollBar();
    window=new Window();

    constructor() {
    }
    CreateScrollBar() {     
    }
    CreateWindow() {  
    }
	
  }

5.4 ConcreteFactory

        具体的创建工厂为:MotiWidgetFactory和PMWidgetFactory(PM理解成Moti、Mac外的另一种系统界面

        MotiWidgetFactory类:


import   WidgetFactory   from '../WidgetFactory.js';
import MotiScrollBar  from '../../ScrollBar/impl/MotiScrollBar.js';
import  MotiWindow  from '../../Window/impl/MotiWindow.js';


export default  class MotiWidgetFactory extends WidgetFactory{
    constructor() {
        super();
    }
    CreateScrollBar() { 
        this.scrollBar=new MotiScrollBar();
		return this.scrollBar;	
    }
    CreateWindow() {  
        this.window=new MotiWindow();  
		return this.window;
    }
  }
 

         PMWidgetFactory类:


  import   WidgetFactory   from '../WidgetFactory.js';
  import   PMScrollBar  from '../../ScrollBar/impl/PMScrollBar.js';
  import  PMWindow  from '../../Window/impl/PMWindow.js';
  
  export default class PMWidgetFactory extends WidgetFactory {
    constructor() {
        super();
    }
    CreateScrollBar() {    
        this.scrollBar=new PMScrollBar();
		return this.scrollBar;
    }
    CreateWindow() {  
        this.window=new PMWindow();  
		return this.window;
    }
  }
 

5.5 AbstractProduct

         此处的抽象产品类是:Window

export default  class Window{
    constructor() {
    }
	movewindow()
	{
		
	}
	close()
	{
		
	}
	fl()
	{
		console.log(` Window fl `);
	}
	fg()
	{
		console.log(` Window fg `);
	}
  } 

5.6 ConcreteProduct  

         具体产品类:MotiWindow和PMWindow

MotiWindow

 import   Window   from '../Window.js';
 
 export default  class MotiWindow extends Window{
    constructor() {
        super();
        console.log(` MotiWindowMoti be create `);
    }
	movewindow()
	{
		console.log(` MotiWindowMoti movewindow `);
	}
	close()
	{
		console.log(` MotiWindowMoti close `);
	}
	fg()
	{
		console.log(` MotiWindowMoti fg `);
	}
 }

PMWindow

import Window  from '../Window.js';

export default  class PMWindow extends Window{
    constructor() {
        super();
        console.log(` PMWindow be create `);
    }
	movewindow()
	{
		console.log(` PMWindow movewindow `);
	}
	close()
	{
		console.log(` PMWindow be close `);
	}
	fg()
	{
		console.log(` PMWindow fg `);
	}
 }

5.7 Client 

import WidgetFactory from './WidgetFactory/WidgetFactory.js';
// import PMWidgetFactory from './WidgetFactory/impl/PMWidgetFactory.js';

import MotiWidgetFactory from './WidgetFactory/impl/MotiWidgetFactory.js';

import ScrollBar  from './ScrollBar/ScrollBar.js';
import Window  from './Window/Window.js'; 
export default class Client{
    main(){
  //       let pmFactory =new PMWidgetFactory();//WidgetFactory
  //       pmFactory.CreateScrollBar();
  //       let window= pmFactory.CreateWindow();
		// window.movewindow();
		// window.close();
		
	    let pmFactory =new MotiWidgetFactory();//WidgetFactory
		pmFactory.CreateScrollBar();
		let window=pmFactory.CreateWindow();//Window
		window.movewindow();
		window.close();
		window.fl();
		window.fg();	
    } 
 }

5.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>

测试结果:


MotiScrollBar.js:6  MotiScrollBar be create 
MotiWindow.js:7  MotiWindowMoti be create 
MotiWindow.js:11  MotiWindowMoti movewindow 
MotiWindow.js:15  MotiWindowMoti close 
Window.js:14  Window fl 
MotiWindow.js:19  MotiWindowMoti fg 

六、源代码下载

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

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

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

相关文章

这俩个技巧 解决了90%的冲突

解决冲突的关键技巧 关于本书作者&#xff1a; 达纳.卡斯帕森&#xff0c;冲突调节的专家&#xff0c;尚普兰大学人际冲突专业的硕士。三次获得芭蕾舞国际协会搬的最佳舞者奖。 关于本书&#xff1a; 这是一本引导别人如何化解一段冲突&#xff0c;达成一次有效沟通的社交类…

DataX 及 DataX-Web 安装使用详解

文章目录一、DataX安装1、解压datax.tar.gz2、运行自检脚本二、Datax-Web安装1、解压DataXWeb安装包2、执行一键安装脚本3、启动服务前段时间在项目上使用了阿里的离线数据同步工具datax&#xff0c;在大批量的表同步过程中踩了一些坑&#xff0c;所以详细介绍一下&#xff0c;…

五、伊森商城 前端基础-Vue Vue脚手架原理与使用 p27

目录 Vue项目结构 一、使用vue脚手架进行模块化开发 1、main文件 1.1、首先new Vue创建了一个vue实例&#xff0c;这个实例挂载了index.html中的app元素 1.2、使用了路由&#xff0c;这个路由是简写的写法 1.3、components使用了一个组件叫App 1.4、最终渲染 2、App.vu…

卷积神经网络相关模型

卷积神经网络相关模型1. CNN架构2. CNN架构模型2.1LeNet模型2.2Alexnet模型2.3VGG16模型2.3.1 使用多层小卷积核代替一层大的卷积核优点2.3.2 使用1*1卷积核优点2.3.2 模型特点卷积神经网络基本概念相关知识连接 卷积神经网络基本概念相关知识连接 1. CNN架构 模型分为2部分【…

ubuntu1804在rviz中显示kitti数据集的2D检测框和激光雷达的3D检测框

之前所做的工作参考上篇博客ubuntu1804发布kitti数据集的gps资料,imu资料(包含发布图片,点云过程)_FYY2LHH的博客-CSDN博客 本次将详解如何在ros播放的kitti数据集上作出检测框,首先需要知道的是对于kitti数据集中的每一帧都必须提前进行标注,而这个工作已经被别人完成了…

42. Python range函数—生成器函数

42. range函数—生成器函数 文章目录42. range函数—生成器函数1. 什么是range( )函数2. 回顾列表切片的语法3. range( )函数的语法3. range函数实操3.1 只有1个参数3.2 有2个参数3.3 有3个参数3.4 步长为负数4. list不能完全替代range5. 总结1. 什么是range( )函数 range[reɪ…

基于遗传算法在机器人路径规划中的应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

第十七章 优先队列优化Dijkstra算法

第十七章 优先队列优化Dijkstra算法一、普通dijkstra算法的缺陷1、选出最小距离的过程&#xff1a;2、松弛所有点的过程&#xff1a;二、如何优化1、代码模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;模板&#xff1a;2、详细解读三、优化分析1、使…

5G赋能行业应用,助推数智化转型!

导语 | 5G 技术的蓬勃发展推动其行业应用的巨轮乘风破浪、扬帆启航&#xff0c;5G 技术不断落地布局于各行各业&#xff0c;基础建设也不断完善&#xff0c;5G to B 的时代已经到来。此次&#xff0c;我们邀请到了中国电信研究院工业互联网技术研发部主任、腾讯云 TVP 谭华老师…

知识图谱-KGE-语义匹配-双线性模型(打分函数用到了双线性函数)-2014:TATEC

【paper】 Effective Blending of Two and Three-way Interactions for Modeling Multi-relational Data 【简介】 本文是法国 Antoine Bordes 团队发表在 ECML-PKDD 2014 上的工作&#xff0c;提出了 TATEC&#xff08;Two and Three-way Embeddings Combination&#xff09;…

ERP+MES集成管理系统重要性有哪些?

随着企业信息化观念的提升&#xff0c;管理方式也愈来愈信息化&#xff0c;因此以信息化推动企业的不断发展趋势已变成企业存活和发展的主要核心理念。其中E&#xff32;P 系统和 MES 系统在企业发展和改革中起着非常重要的作用。当各种信息化系统在企业内各个部门顺利执行的同…

RabbitMQ安装教程(超详细)

本教程是在centos8下试验的&#xff0c;其实linux系统的都差不多 RabbitMQ官方&#xff1a;Messaging that just works — RabbitMQ RabbitMQ是开源AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;Python、Ruby、 NET、Java、JMS、c、PHP、action screcrive AMQP …

python 爬虫入门该怎么学习?

前言 1、什么是爬虫和爬虫的基本逻辑 “爬虫”是一种形象的说法。互联网比喻成一张大网&#xff0c;爬虫是一个程序或脚本在这种大网上爬走。碰到虫子&#xff08;资源&#xff09;&#xff0c;若是所需的资源就获取或下载下来。这个资源通常是网页、文件等等。可以通过该资源…

Android NDK 开发之 CMake 必知必会

Android Studio 从 2.2 版本起开始支持 CMake ,可以通过 CMake 和 NDK 将 C/C 代码编译成底层的库&#xff0c;然后再配合 Gradle 的编译将库打包到 APK 中。 这意味就不需要再编写 .mk 文件来编译 so 动态库了。 CMake 是一个跨平台构建系统&#xff0c;在 Android Studio 引…

12月7日 补充数据库链式操作,只生成sql语句,不执行sql的几种函数以及thinkphp中验证器

补充知识&#xff1a; 生成sql语句但是不会执行sql语句 public function fetchSqlTest(){$result Db::name(user)->fetchSql(true)->select();//dump($result);//使用正常select查询默认中select(true&#xff09;改为false即可返回sql语句$result Db::name(user)->…

UNIX/LINUX操作系统内核结构

通用操作系统的现状和分类 UNIX操作系统的根本特点&#xff1a;分时多用户、开放性 基本功能特征 系统结构 操作系统核心 系统调用的集合及实现系统调用的内部算法就形成操作系统核心 系统调用 以函数形式提供给核外的命令和上层应用系统使用的一组程序&#xff0c;涵…

观察者模式

目录 一、观察者模式解决了哪些问题&#xff1a; 二、体检的小栗子 三、什么是观察者模式 四、代码实现 一、观察者模式解决了哪些问题&#xff1a; 对象之间的一对多依赖关系应该在不使对象紧密耦合的情况下定义。应该确保当一个对象改变状态时&#xff0c;自动更新无限数…

5-5:显示系统的通知

通知列表 显示评论、点赞、关注三种类型的通知。 通知详情 分页显示某一类主题所包含的通知。 未读消息 在页面头部显示所有的未读消息数量 通知存在message表里面 修改MessageMapper.java package com.nowcoder.community.dao;import com.nowcoder.community.entity.Messa…

毕业2年,跳槽到我们公司拿18K,这就是00后卷王带来的压迫感吗?

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不…

AI 也会写代码了,但我并不担心

如果你比较关注人工智能&#xff0c;可能会注意到最近圈子的人都在刷屏一个 AI 玩意&#xff0c;叫 ChatGPT 。我一直关注的和菜头在他的公众号槽边往事上就接连写了几篇文章。为什么和菜头是男的&#xff0c;读者却要叫他“婶婶”怎么把AI逼到生气水文与干货如果看完上面的第一…