设计模式学习之工厂方法模式

设计模式系列往期文章

  1. 设计模式学习之策略模式
  2. 设计模式学习之策略模式在前端的应用
  3. 设计模式学习之简单工厂模式

在上一篇文章中我们学习了简单工厂模式——这是工厂模式中最简单的一种模式,通过工厂类提供的方法创建类(可以类比为产品),将对象创建的具体逻辑屏蔽了起来。在需求比较简单,产品的数量比较少的情况下,简单工厂模式已经能够满足业务需要了,但是如果当产品数量非常多的时候(如几十上百个),使用简单工厂就有些捉襟见肘了。

以下图为例,我们需要开发一个跨平台的UI工具库,该工具库至少能够在Windows应用和网页端运行,很明显同一个组件(如Button)在这两个平台的实现代码是不一样的,在这种情况下使用简单工厂模式进行实现就有些麻烦了,因为现在有两个维度:平台和组件,那么应该怎么做呢?
在这里插入图片描述
我们先试着将这个问题简化:如果现在不考虑跨平台应用,只支持HTML进行组件的绘制就可以,这个时候就可以使用简单工厂了,代码如下:

interface Element {void render();void onClick();
}class Button implements Element {public void render() {System.out.println("<button>Test Button</button>");onClick();}public void onClick() {System.out.println("Click! Button says - 'Hello World!'");}
}class Text implements Element {public void render() {System.out.println("<p>Test Text</p>");onClick();}public void onClick() {System.out.println("Click! Text says - 'Hello World!'");}
}class ElementFactory {public static Element createElement(String type) {switch(type) {case "Button":return new Button();case "Text":return new Text();default:return null;}}
}

之所以可以这么写,是因为产品数量比较少并且工厂产出的数据都是同一个维度的。对于多维度的数据的时候就需要请出工厂方法模式了,对应的实现思路就如上图所示的那样:

  • 将Button看做工厂生产的产品接口
  • 将WindowButton和HTMLButton看做具体的产品实现类
  • 将WindowDialog和WebDialog看做具体的工厂实现类,由他们负责生产出对应的产品
  • 将Dialog看做工厂类的抽象接口

上面的类的实现伪代码如下:

// 创建者类声明的工厂方法必须返回一个产品类的对象。创建者的子类通常会提供
// 该方法的实现。
class Dialog is// 创建者还可提供一些工厂方法的默认实现。abstract method createButton():Button// 请注意,创建者的主要职责并非是创建产品。其中通常会包含一些核心业务// 逻辑,这些逻辑依赖于由工厂方法返回的产品对象。子类可通过重写工厂方// 法并使其返回不同类型的产品来间接修改业务逻辑。method render() is// 调用工厂方法创建一个产品对象。Button okButton = createButton()// 现在使用产品。okButton.onClick(closeDialog)okButton.render()// 具体创建者将重写工厂方法以改变其所返回的产品类型。
class WindowsDialog extends Dialog ismethod createButton():Button isreturn new WindowsButton()class WebDialog extends Dialog ismethod createButton():Button isreturn new HTMLButton()// 产品接口中将声明所有具体产品都必须实现的操作。
interface Button ismethod render()method onClick(f)// 具体产品需提供产品接口的各种实现。
class WindowsButton implements Button ismethod render(a, b) is// 根据 Windows 样式渲染按钮。method onClick(f) is// 绑定本地操作系统点击事件。class HTMLButton implements Button ismethod render(a, b) is// 返回一个按钮的 HTML 表述。method onClick(f) is// 绑定网络浏览器的点击事件。class Application isfield dialog: Dialog// 程序根据当前配置或环境设定选择创建者的类型。method initialize() isconfig = readApplicationConfigFile()if (config.OS == "Windows") thendialog = new WindowsDialog()else if (config.OS == "Web") thendialog = new WebDialog()elsethrow new Exception("错误!未知的操作系统。")// 当前客户端代码会与具体创建者的实例进行交互,但是必须通过其基本接口// 进行。只要客户端通过基本接口与创建者进行交互,你就可将任何创建者子// 类传递给客户端。method main() isthis.initialize()dialog.render()

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界面开发框架Qt新手入门教程:如何使用Calendar组件创建日历(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的CalendarWi…

主动式和被动式电容笔哪个好用?苹果平板平替笔排行

被动式电容笔与主动式电容笔最大的不同在于主动式电容笔具有更广泛的应用领域&#xff0c;可以与不同种类的电容屏幕进行匹配。随着人们对其了解的不断深入&#xff0c;其应用也日益广泛。除此之外&#xff0c;平替电容笔的技术&#xff0c;也在不断的改进和提高&#xff0c;逐…

ES批量上传数据 - Python操作ES

代码 # -*- coding: utf-8 -*- # Author : markadcimport randomfrom elasticsearch import Elasticsearch, helpersurl http://localhost:9200/ client Elasticsearch(url) index testsome [] for i in range(1, 10001):docu {uid: i, age: random.randint(1, 100)} …

【网络】协议的定制与Json序列化和反序列化

文章目录 应用层初识TCP协议通讯流程定制协议再谈协议网络版本计算器Protocal.hppCalServerCalClient Json的安装 应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 初识TCP协议通讯流程 建立链接和断开链接 基于TCP协议&#xff0c…

[Unity][疑难杂症]Mac电脑打开工程unity attempt to write a readonly database

报错的根本原因&#xff1a; 你Unity项目所在的硬盘&#xff0c;格式不是MacOS或者APFS格式&#xff0c;我的是ExFAT所以报这个错。 可能出现的问题&#xff1a; 1、删除unity项目中的c#之类的文件就会报错&#xff0c;并且强制退出 2、新项目压根打不开&#xff0c;在生成资源…

图片:前端展示图像(img 、picture、svg、canvas )及常用图片格式(PNG、JPG、JPEG、WebP、GIF、SVG、AVIF等)

一、浏览器网页展示图片方法 1.1、HTML <img> 标签 <!DOCTYPE html> <html><head><title>图片展示</title></head><body><h1>图片展示</h1><img src"example.jpg" alt"Example Image" w…

IPO观察丨健身器材行业加“数”前行,康力源如何重构竞争壁垒?

近年来&#xff0c;健身器材市场的火热&#xff0c;引来了资本的广泛关注。数据显示&#xff0c;2021年中国健身器材市场规模为546.5亿元&#xff0c;同比增长15%&#xff0c;预计2024年或可达到799.6亿元。在这股浪潮之下&#xff0c;多家健身器材企业递出了IPO申请。比如&…

合同数智化如何助力地产企业实现变革“突围”?

从稳步发展到求新求变&#xff0c; 数智化成破局关键 近年来&#xff0c;随着宏观经济政策调整&#xff0c;在中央房住不炒的大基调下&#xff0c;房地产逐步回归居住属性。在这样的大背景下&#xff0c;针对不同类型的房地产企业&#xff0c;国家出台了不同的数字化转型指导文…

Linux——1初识linux

目录 1.1 硬件和软件 1.2 初识Linux 1.2.1 Linux的诞生 1.2.2 LInux内核 1.2.3 Linux发行版 1.3 虚拟机介绍 1.4 VMware WorkStation 安装 1.5 在VMware上安装Linux 1.6 远程连接Linux系统 1.6.1 图形化、命令行 1.6.2 FinalShell 1.1 硬件和软件 我们所熟知的计算…

基于安卓的初中英语语法APP设计与实现(源码+文档+PPT)

智能手机的普及使移动学习成为一种全新的学习方式,越来越受到研究者与学习者的关注。调查显示,移动学习对英语学习特别是应用英语的学习有良好的效果。基于Android设计开发的英语语法APP包含“练习题册”、“语法分析”、“搜索语法”三大功能模块,能够帮助学生利用碎片时间学习…

发起投票平台投票吧网络投票平台网络投票平台

小程序投票活动如何做&#xff1f;很多企业在运营当中&#xff0c;都会通过投票活动来进行推广&#xff0c;从而达到吸粉、增加用户粘度等效果。而此类投票活动&#xff0c;通过小程序就可以实现&#xff0c;操作简单。 我们现在要以“促进诚信经营”为主题进行一次投票活动&am…

rust abc(5): 常量

文章目录 1. 目的2. 基本用法2.1 说明2.2 运行结果 3. 不推荐或不正确用法3.1 不推荐用小写字母作为常量名字3.2 常量名称中含有小写字母就会报warning3.3 定义常量时&#xff0c;不指定数据类型会编译报错 4. const 和 immutable 的区别4.1 const 可以在函数外声明&#xff0c…