设计模式概述 - 工厂方法 & 原型 & 模板方法 & 外观

工厂方法模式简述

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法将类的实例化推迟到子类。

角色

  • 产品接口(Product):定义产品的接口。
  • 具体产品(ConcreteProduct):实现产品接口的具体类。
  • 工厂接口(Creator):定义创建产品的工厂方法。
  • 具体工厂(ConcreteCreator):实现工厂接口,返回具体产品的实例。

优点

  • 解耦:客户端不需要知道具体产品的类,只需依赖于产品接口。
  • 扩展性:增加新产品时只需新增具体产品和具体工厂,而不需要修改已有代码。

缺点

  • 类的数量增加:每增加一种产品,就需要增加一个具体产品和一个具体工厂,可能导致类的数量增加。
  • 复杂性:对于简单的场景,使用工厂方法模式可能显得过于复杂。

示例代码

// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProductA.");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProductB.");}
}// 工厂接口
abstract class Creator {public abstract Product factoryMethod();
}// 具体工厂A
class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();Product productA = creatorA.factoryMethod();productA.use();Creator creatorB = new ConcreteCreatorB();Product productB = creatorB.factoryMethod();productB.use();}
}

原型模式简述

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的实例来创建新对象,而不是通过实例化一个新的对象。这种模式适用于创建相似对象的场景,尤其是在创建对象的成本较高时。

角色

  • 原型接口(Prototype):定义克隆方法。
  • 具体原型(ConcretePrototype):实现原型接口,提供具体的克隆方法。
  • 客户端(Client):使用原型对象来创建新的对象。

优点

  • 性能提升:通过复制现有对象来创建新对象,避免了重复的初始化过程。
  • 简化创建过程:可以通过克隆现有对象来简化对象的创建过程。

缺点

  • 复杂性:实现克隆方法可能会增加代码的复杂性,尤其是在对象包含复杂的成员时。
  • 深拷贝与浅拷贝:需要关注对象的拷贝方式,深拷贝和浅拷贝的选择可能会影响对象的状态。

示例代码

// 原型接口
interface Prototype {Prototype clone();
}// 具体原型
class ConcretePrototype implements Prototype {private String name;public ConcretePrototype(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() {return new ConcretePrototype(this.name);}
}// 客户端代码
public class Client {public static void main(String[] args) {ConcretePrototype original = new ConcretePrototype("Original");ConcretePrototype clone = (ConcretePrototype) original.clone();System.out.println("Original Name: " + original.getName());System.out.println("Cloned Name: " + clone.getName());}
}

模板方法模式简述

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义某些特定步骤。通过这种方式,模板方法模式可以实现代码复用和算法的灵活性。

角色

  • 抽象类(AbstractClass):定义模板方法和一些基本操作的接口。
  • 具体类(ConcreteClass):实现抽象类中的某些操作,完成特定的算法步骤。

优点

  • 代码复用:通过将算法的公共部分放在抽象类中,减少了代码重复。
  • 灵活性:子类可以根据需要重写某些步骤,灵活定制算法的具体实现。

缺点

  • 增加复杂性:模板方法模式可能会导致类的数量增加,从而增加系统的复杂性。
  • 限制扩展:子类只能重写抽象类中定义的方法,可能会限制某些灵活性。

示例代码

// 抽象类
abstract class AbstractClass {// 模板方法public final void templateMethod() {stepOne();stepTwo();stepThree();}// 基本方法protected abstract void stepOne();protected abstract void stepTwo();// 钩子方法protected void stepThree() {System.out.println("Default Step Three Implementation.");}
}// 具体类A
class ConcreteClassA extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassA: Step One Implementation.");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassA: Step Two Implementation.");}
}// 具体类B
class ConcreteClassB extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassB: Step One Implementation.");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassB: Step Two Implementation.");}@Overrideprotected void stepThree() {System.out.println("ConcreteClassB: Custom Step Three Implementation.");}
}// 客户端代码
public class Client {public static void main(String[] args) {AbstractClass classA = new ConcreteClassA();classA.templateMethod();System.out.println();AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}

外观模式简述

外观模式(Facade Pattern)是一种结构型设计模式,它为复杂的子系统提供一个统一的接口,使得子系统更易使用。通过外观模式,客户端可以通过一个简单的接口与复杂的系统进行交互,从而降低系统的复杂性。

角色

  • 外观类(Facade):提供一个简单的接口,封装了复杂的子系统。
  • 子系统类(Subsystem):实现具体的功能,通常由多个类组成。

优点

  • 简化接口:通过提供统一的接口,简化了子系统的使用。
  • 降低耦合:客户端与子系统之间的依赖关系减少,提高了系统的可维护性。
  • 提高可读性:外观模式使得代码的结构更加清晰,易于理解。

缺点

  • 可能导致功能膨胀:外观类可能会变得过于复杂,承担过多的责任。
  • 不符合开放-封闭原则:如果子系统发生变化,可能需要修改外观类的实现。

示例代码

// 子系统类A
class SubsystemA {public void operationA() {System.out.println("SubsystemA: Operation A");}
}// 子系统类B
class SubsystemB {public void operationB() {System.out.println("SubsystemB: Operation B");}
}// 子系统类C
class SubsystemC {public void operationC() {System.out.println("SubsystemC: Operation C");}
}// 外观类
class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();subsystemC = new SubsystemC();}public void simpleOperation() {subsystemA.operationA();subsystemB.operationB();subsystemC.operationC();}
}// 客户端代码
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.simpleOperation();}
}

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

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

相关文章

推动检测认证行业迈向智能化 AITIC一体机发布会在京举办

来源:新华社客户端国家市场监督管理总局认证认可技术研究中心(简称“认研中心”)近日联合技术合作伙伴在北京举办AITIC软硬件一体机发布会。据了解,“AITIC一体机”是专为检测认证行业设计的智能硬件,提供低成本的本地化部署方案,…

权限即数据:企业系统中的字段级访问控制架构实战(β=0.6)

摘要 这篇文章介绍了一个企业系统中的字段权限解析方案,通过规则表与命中记录表(biz_rule_hit)联动,实现对业务数据的动态权限控制。流程包括替换用户上下文变量、记录命中规则、查询业务数据并关联命中信息,最终在内存…

Python爬虫实战:研究Specialty Plots模块,构建空气质量监测数据采集和分析系统

1. 引言 1.1 研究背景 随着全球城市化进程的加速和工业的快速发展,空气质量问题已成为影响人类健康和生态环境的重要因素。世界卫生组织数据显示,全球超过 90% 的人口生活在空气质量超标的环境中,空气污染每年导致约 700 万人过早死亡。准确、及时地获取和分析空气质量数据…

字典树算法

一、什么是Trie? Trie(发音为"try"),也称为字典树、前缀树,是一种多叉树结构,专门用于高效存储和检索字符串集合。其核心特点是共享字符串的公共前缀,从而大幅减少冗余存储&#xff0…

Laya使用VideoNode动态加载视频,可以自定义播放视频此处以及位置

export class VideoCommand {video: Laya.VideoNode;public duration: number 0;/*** param videoPos 视频位置* param videoSize 视频大小*/public constructor(videoPos: Laya.Vector2, videoSize: Laya.Vector2) {this.video new Laya.VideoNode;//添加到舞台 1是场景中的…

yum localinstall安装本地包

yum localinstall 是一个用于安装本地 RPM 包并自动处理依赖关系的命令。当你有一个或多个本地的 RPM 包需要安装,又希望 yum 能帮你解决可能存在的依赖问题时,这个命令就非常有用。下面我会详细解释它的用法和注意事项。 🖥️ 命令基本用法 yum localinstall 命令的基本…

LeetCode 面试经典 150 题:轮转数组(三次翻转法详解 + 多解法对比)

在数组类算法题中,“轮转数组” 是一道考察 “原地操作” 与 “逻辑转换” 能力的经典题目。所谓 “轮转”,是指将数组元素向右移动指定步数,且超出数组长度的元素需 “循环” 到数组开头。这道题的最优解 ——三次翻转法,能以 O …

网络编程---TCP

1.TCP:传输控制协议,位于传输层2.TCP的特性:a.使用流式套接字,数据连续,有顺序b.TCP是可靠传输,有有应答机制ACK,即收到数据后会明确告知发送方已收到数据;若发送方没有在预计时间收…

对计算机网络模型的理解

文章目录 目录 前言 一、Internet 的核心特点 二、Internet 的组成结构 1. 硬件基础:网络运行的 “物理载体” 2. 软件支撑:网络运行的 “功能桥梁” 3. 协议规则:网络运行的 “通用语言” 三、OSI 七层参考模型(理论标准&…

每日一算:分发糖果

在算法面试中,“分发糖果” 是一道经典的贪心算法应用题,核心考察对 “局部最优推导全局最优” 的理解。本文将从问题分析出发,提供两种主流解题思路,并附上 C 实现代码,帮助你彻底掌握这道题。一、问题重述题目要求有…

【WorkManager】无法在 Direct Boot 模式下初始化

【WorkManager】无法在 Direct Boot 模式下初始化一、问题描述二、问题分析2.1 关于 Direct Boot 模式2.2 支持 Direct Boot 模式2.3 手动初始化 WorkManager 组件2.4 WorkManager 不支持 Direct Boot 的官方修改三、解决方案一、问题描述 在使用 WorkManager 库来实现开机上报…

Hybrid应用性能优化实战分享(本文iOS 与 H5为例,安卓同理)

前言在移动应用开发中,Hybrid 架构因其跨平台特性和开发效率优势被广泛采用。然而,WebView 的性能问题一直是开发者面临的挑战。本文将基于实际项目经验,分享 iOS Hybrid 应用的核心优化策略,涵盖 WebView 池化、预加载、用户体验…

点积、叉积、矩阵行列式详解、线性相关与线性无关、矩阵的秩、矩阵可逆与不可逆详解

1.向量 1.1 点积(Dot Product) 1.1.1 定义 点积是在求一个标量,点积结果没有方向。 对于两个向量u(u1,u2,u3),v(v1,v2,v3)\bold{u}(u_1,u_2,u_3),\bold{v}(v_1,v_2,v_3)u(u1​,u2​,u3​),v(v1​,v2​,v3​) 点积定义为:u⋅vu1v1u…

Mac安装nvm详细教程(超简单)

本章教程,主要介绍如何在Mac操作系统上安装nvm. 我们使用官方一键安装脚本,完成安装 一、安装步骤 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash配置环境变量,编辑.zshrc文件 vim .zshrcexport NVM_DIR="$(

【selenium】网页元素找不到?从$(‘[placeholder=“手机号“]‘)说起

网页元素找不到?从$(‘[placeholder“手机号”]’)说起总结:控制台不骗人,元素选不到,八成是写法、时机或环境的问题。我们在写网页自动化脚本或者调试页面的时候,经常遇到一个让人头疼的问题:明明元素就在…

SSE 模仿 GPT 响应

后端代码 const express require(express) const cors require(cors);const app express(); app.use(cors()); const port 3000;app.listen(port, () > {console.log(Server running at http://localhost:${port}/); });const msg 全国同胞们, 尊敬的各位国…

MAC 多个版本 JDK进行切换

1.查看本机所有的jdk/usr/libexec/java_home -V2、打开bash_profile文件。可以在终端vim ~/.bash_profile打开,也可以打开访达shiftcmdG然后输入/Users/mac/.bash_profile(本机bash_profile的路径)加入新的环境变量格式如下(参考我…

shell 中 expect 详解

一、概述Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者DonLibes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件。通过expect系统管理员可以创…

第4讲 机器学习基础概念

机器学习作为人工智能的子领域,专注于训练计算机算法自动发现数据中的模式与关联关系。以下是其核心基础概念:4.1 数据数据是机器学习的基石。缺乏数据,算法将无从学习。数据可呈现为结构化数据(如电子表格、数据库)和…

Go组合式继承:灵活替代方案

Go 语言没有传统面向对象编程中的继承机制,但通过组合和接口实现类似功能。Go 更提倡组合优于继承的设计原则,这种设计方式更灵活且易于维护。结构体组合(伪继承)通过嵌套结构体实现类似继承的效果。子结构体可以直接访问父结构体…