设计模式探索:从理论到实践的编码示例 (软件设计师笔记)
😀前言
设计模式,作为软件工程领域的核心概念之一,向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码,而且也促进了代码的复用性。通过这篇文章,我们将探讨其中一些基本的设计模式,并为每个模式提供相应的代码示例,以便于更好地理解它们的实际应用。
🏠个人主页:尘觉主页

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
在csdn获奖荣誉: 🏆csdn城市之星2名
💓Java全栈群星计划top前5
🤗 端午大礼包获得者
🥰阿里云专家博主
😉亚马逊DyamoDB结营
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊
文章目录
- 第七章 面向对象技术 补充-上
- 🔺设计模式
- 设计模式的要素
- 创建型设计模式(5种)
- 1. Simple Factory(简单工厂)
- 2. Factory Method(工厂方法)
- 3. Abstract Factory(抽象工厂)
- 4. Builder(生成器)
- 5. Prototype(原型)
- 6. Singleton(单例)
- 😄总结
第七章 面向对象技术 补充-上
🔺设计模式
设计模式的要素
设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构。
设计模式基本要素:
-
模式名称(Pattern Name)
-
问题(Problem)
-
解决方案(Solution)
-
效果(Consequences)
<img src="https://picgoowyx.oss-cn-guangzhou.aliyuncs.com/imags/202309210851610.png" style="zoom:50%;" />
创建型设计模式(5种)
1. Simple Factory(简单工厂)
简单工厂模式属创建型模式,但不属于23种设计模式之一。
定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)。
<img src="https://picgoowyx.oss-cn-guangzhou.aliyuncs.com/imags/202309210851611.png" style="zoom:50%;" />
/*** 简单工厂模式*/
public class SimpleFactory {public static void main(String[] args) {Product productA = Factory.createProduct("A");productA.info();Product productB = Factory.createProduct("B");productB.info();}
}class Factory{public static Product createProduct(String type){Product product =null;switch (type){case "A":product = new ProductA();break;case "B":product = new ProductB();break;default:System.out.println("没有 " + type + " 类型的产品!");return null;}return product;}
}abstract class Product{public abstract void info();
}class ProductA extends Product{@Overridepublic void info() {System.out.println("产品的信息:A");}
}class ProductB extends Product{@Overridepublic void info() {System.out.println("产品的信息:B");}
}
2. Factory Method(工厂方法)
1)意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
2)结构
<img src="https://picgoowyx.oss-cn-guangzhou.aliyuncs.com/imags/202309210851612.png" style="zoom:50%;" />
/*** 工厂方法模式*/
public class FactoryMethod {public static void main(String[] args) {// 父类 对象名 = new 子类();Factory factoryA = new FactoryA();Product productA = factoryA.createProduct();productA.info();Factory factoryB = new FactoryB();Product productB = factoryB.createProduct();productB.info();}
}interface Factory{Product createProduct();
}class FactoryA implements Factory{@Overridepublic Product createProduct() {return new ProductA();}
}class FactoryB implements Factory{@Overridepublic Product createProduct() {return new ProductB();}
}interface Product{void info();
}class ProductA implements Product{@Overridepublic void info() {System.out.println("产品的信息:A");}
}class ProductB implements Product{@Overridepublic void info() {System.out.println("产品的信息:B");}
}
3)适用性
Factory Method 模式适用于:
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3. Abstract Factory(抽象工厂)
1)意图
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
2)结构

/*** 抽象工厂模式*/
public class AbstractFactory {public static void main(String[] args) {Factory factory1 = new Factory1();ProductA productA1 = factory1.createProductA();productA1.info();ProductB productB1 = factory1.createProductB();productB1.info();Factory factory2 = new Factory2();ProductA productA2 = factory2.createProductA();productA2.info();ProductB productB2 = factory2.createProductB();productB2.info();}
}// 声明一个创建抽象产品对象的操作接口
interface Factory{ProductA createProductA();ProductB createProductB();
}// 实现创建具体产品对象的操作
class Factory1 implements Factory{@Overridepublic ProductA createProductA() {return new ProductA1();}@Overridepublic ProductB createProductB() {return new ProductB1();}
}class Factory2 implements Factory{@Overridepublic ProductA createProductA() {return new ProductA2();}@Overridepublic ProductB createProductB() {return new ProductB2();}
}// 为一类产品对象声明一个接口
interface ProductA{void info();
}interface ProductB{void info();
}// 定义一将被相应的具体工厂创建的产品对象
class ProductA1 implements ProductA{@Overridepublic void info() {System.out.println("产品的信息:A1");}
}class ProductA2 implements ProductA{@Overridepublic void info() {System.out.println("产品的信息:A2");}
}class ProductB1 implements ProductB{@Overridepublic void info() {System.out.println("产品的信息:B1");}
}class ProductB2 implements ProductB{@Overridepublic void info() {System.out.println("产品的信息:B2");}
}
3)适用性
Abstract Factory 模式适用于:
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当提供一个产品类库,只想显示它们的接口而不是实现时。
4. Builder(生成器)
1)意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2)结构

import java.util.*;/*** 生成器模式*/
public class Main {public static void main(String[] args) {Director director = new Director();Builder builder1 = new Builder1();director.Construct(builder1);Product product1 = builder1.getResult();product1.show();Builder builder2 = new Builder2();director.Construct(builder2);Product product2 = builder2.getResult();product2.show();}
}class Director{public void Construct(Builder builder){builder.BuildPart();}
}abstract class Builder{public abstract void BuildPart();public abstract Product getResult();
}class Builder1 extends Builder{Product product = new Product();@Overridepublic void BuildPart() {product.add("A");product.add("B");product.add("C");product.add("D");product.add("E");product.add("F");}@Overridepublic Product getResult() {return product;}
}class Builder2 extends Builder{Product product = new Product();@Overridepublic void BuildPart() {product.add("A");product.add("B");product.add("C");}@Overridepublic Product getResult() {return product;}
}class Product{List<String> parts = new ArrayList<String>();public void add(String part){parts.add(part);}public void show(){System.out.print("产品的组成:");for (String part : parts) {System.out.print(part + " ");}System.out.println();}
}
3)适用性
Builder 模式适用于:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
5. Prototype(原型)
1)意图
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
2)结构
其中:
- Prototype声明一个复制自身的接口。
- ConcretePrototype 实现一个复制自身的操作。
- Client 让一个原型复制自身从而创建一个新的对象

/*** 原型模式*/
public class Main {public static void main(String[] args) {Product product1 = new Product(2022,5.28);System.out.println(product1.getId()+ " " + product1.getPrice());Product product2 = (Product) product1.Chlone();System.out.println(product2.getId()+ " " + product2.getPrice());}
}interface Prototype{Object Chlone();
}class Product implements Prototype{private int id;private double price;public Product(){}public Product(int id,double price){this.id = id;this.price = price;}public int getId() {return id;}public double getPrice() {return price;}@Overridepublic Object Chlone() {Product object = new Product();object.id = this.id;object.price = this.price;return object;}
}
3)适用性
Prototype 模式适用于:
- 当一个系统应该独立于它的产品创建、构成和表示时。
- 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
- 为了避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。
6. Singleton(单例)
1)意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2)结构

其中:Singleton指定一个Instance操作,允许客户访问它的唯一实例,Instance是一个类
操作:可能负责创建它自己的唯一实例。
/** * 单例模式*/
public class SingletonPattern {public static void main(String[] args) {Singleton instance1 = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();Singleton instance3 = Singleton.getInstance();System.out.println("instance1: " + instance1);System.out.println("instance2: " + instance2);System.out.println("instance3: "+ instance3);}
}class Singleton{private static Singleton instance = new Singleton();private Singleton(){};public static Singleton getInstance(){return instance;}
}

3)适用性
Singleton 模式适用于:
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。
😄总结
经过对各种创建型设计模式的深入探讨和代码实例展示,我们可以更加深入地理解它们如何帮助我们更有效地创建对象。从简单工厂到单例模式,每一种设计模式都有其独特的应用场景和优势。当面对软件设计中的具体问题时,了解如何选择和应用合适的设计模式至关重要。希望本文的内容能为您提供有关设计模式的深入了解,以及如何在实际开发中灵活运用这些模式的启示。
😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
手写机制
微服务组件
spring_尘觉
springMVC
mybits
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞
相关文章:
设计模式探索:从理论到实践的编码示例 (软件设计师笔记)
😀前言 设计模式,作为软件工程领域的核心概念之一,向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码,而且也促进了代码的复用性。通过这篇文章,我们…...
【内网穿透】在Ubuntu搭建Web小游戏网站,并将其发布到公网访问
目录 前言 1. 本地环境服务搭建 2. 局域网测试访问 3. 内网穿透 3.1 ubuntu本地安装cpolar 3.2 创建隧道 3.3 测试公网访问 4. 配置固定二级子域名 4.1 保留一个二级子域名 4.2 配置二级子域名 4.3 测试访问公网固定二级子域名 前言 网:我们通常说的是互…...
在cesuim上展示二维模型
前提问题:在cesuim上展示二维模型 解决过程: 1.获取或定义所需变量 2.通过window.cesium.viewer.imageryLayers.addImageryProvider和new Cesium.UrlTemplateImageryProvider进行建模 3.传入url路径后拼接{z}/{x}/{y}.png 4.聚焦到此模型window.ces…...
c/c++中如何输入pi
标准的 C/C 语言中没有π这个符号及常量,一般在开发过程中是通过开发人员自己定义这个常量的,最常见的方式是使用宏定义: 方法1:#define pi 3.1415926 方法2:使用反三角函数const double pi acos(-1.0);...
python爬虫:JavaScript 混淆、逆向技术
Python爬虫在面对JavaScript混淆和逆向技术时可能会遇到一些挑战,因为JavaScript混淆技术和逆向技术可以有效地阻止爬虫对网站内容的正常抓取。以下是一些应对这些挑战的方法: 分析网页源代码:首先,尝试分析网页的源代码…...
Vue error:0308010C:digital envelope routines::unsupported
vue项目,npm run dev的时候出现:Error: error:0308010C:digital envelope routines::unsupported vue项目,npm run dev的时候出现:Error: error:0308010C:digital envelope routines::unsupported 这个是node的版本问题。我的nod…...
gitee 远程仓库操作基础(一)
git remote add <远程仓库名> <仓库远程地址> :给远程仓库取个别名,简化一大堆字符串操作 git remote add origin xxx.git :取个Origin名字 git remote -v :查看本地存在的远程仓库 git pull <远程仓库名><远程分支名>:<本地分支名> 相同可取消…...
DRM全解析 —— ADD_FB2(0)
本文参考以下博文: DRM驱动(四)之ADD_FB 特此致谢! 在笔者之前的libdrm全解析系列文章中,讲到了drmIoctl(fd, DRM_IOCTL_MODE_ADDFB, &f)以及其封装函数drmModeAddFB。对应的文章链接为: libdrm全解…...
01Redis的安装和开机自启的配置
安装Redis 单机安装Redis 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包(此处选择的Linux版本的CentOS 7) Windows版直接下载对应版本的.zip压缩包解压即可使用 第一步: Redis是基于C语言编写的,因此首先需要…...
进入IT行业:选择前端开发还是后端开发?
一、前言 开发做前端好还是后端好?这是一个常见的问题,特别是对于初学者来说。在编程世界中,前端开发和后端开发分别代表着用户界面和数据逻辑,就像城市的两个不同街区一样。但是,究竟哪个街区更适合我们作为开发者呢…...
Java集成Onlyoffice以及安装和使用示例,轻松实现word、ppt、excel在线编辑功能协同操作,Docker安装Onlyoffice
安装Onlyoffice 拉取onlyoffice镜像 docker pull onlyoffice/documentserver 查看镜像是否下载完成 docker images 启动onlyoffice 以下是将本机的9001端口映射到docker的80端口上,访问时通过服务器ip:9001访问,并且用 -v 将本机机/data/a…...
编程面试_动态规划
题目1 最大连续乘积子串 题目描述给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。也就…...
ip地址可以精确定位吗
在互联网时代,IP地址的重要性不言而喻。作为网络通信的基础,IP地址用于标识每一台连接到互联网的设备。然而,传统的IP地址定位方式仅能粗略地确定设备的大致位置,无法实现精确定位。那么,IP地址能否实现精确定位呢&…...
Xamarin体验:使用C#开发iOS/Android应用
http://www.cnblogs.com/lwme/p/use-xamarin-develop-Android-iOS-app.html Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发。 简介 Xamarin是基于Mono的平台,目前主要有以下产品(更具体请见:h…...
聊聊druid连接池的监控
序 本文主要研究一下druid连接池的监控 init com/alibaba/druid/pool/DruidDataSource.java public void init() throws SQLException {//......registerMbean();//...... }DruidDataSource的init方法会执行registerMbean registerMbean com/alibaba/druid/pool/DruidData…...
CentOS 7 安装 Docker 的详细步骤
文章目录 Docker简介1.更新2.安装必要的软件包3.添加Docker仓库4.安装5.安装后的一些常规设置及常用的命令5.1 启动 Docker5.2 Docker 在系统启动时自动运行5.3 运行一个 Hello World 镜像5.4 查看docker运行状态5.5 docker ps5.6 查看docker版本 6.安装种常见的错误错误1:yum-…...
竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别
文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...
数据结构之【泛型】
泛型:定义阶段不明确具体类型,产生对象时明确具体类型。 //Object是Java中的最高参数统一化,能够接受所有的引用类型; //有了包装类的自动拆装箱之后,Object还能够接收基本类型数值(自动装箱) …...
华为ac无线侧命令行配置思路和步骤
无线侧配置思路: Ap和ac在同一个广播域内,不用配置 option 43 source 源ip回包哪个模式都得配置 Cli配置业务模版流程: 1、 AC控制器上全局配置capwap回包接口地址 1、配置ssid:wifi名称 2、配置安全模版:用户连接密码…...
十六)Stable Diffusion教程:出图流程化
今天说一个流程化出图的案例,适用很多方面。 1、得到线稿,自己画或者图生图加线稿lora出线稿;如果想sd出图调整参数不那么频繁细致,则线稿的素描关系、层次、精深要表现出来,表现清楚。 2、文生图,seed随机…...
计算机毕业设计springboot资源分享网站 基于SpringBoot的在线知识共享与资源协作平台 SpringBoot框架下的数字化学习资料交流与社区系统
计算机毕业设计springboot资源分享网站(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展和知识经济的蓬勃兴起,人们对信息获取与知识共享的需…...
果园灌溉施肥控制系统改造之西门子 S7 - 1200 PLC 实战
果园灌溉施肥控制系统改3 西门子s7-1200plc程序博途v16,带 选型表 io表接线图CAD和运行效果视频最近搞了个果园灌溉施肥控制系统的改造项目,用的是西门子 S7 - 1200 PLC,编程软件是博途 V16,这过程还挺有意思,跟大家…...
关于腾讯广告算法大赛2025项目分析1 - dataset.py
把原始 jsonl 用户行为序列,转成模型能直接吃的张量tensor和特征字典 一、整体定位 MyDataset 读取训练数据,产出: 用户序列 seq正样本 pos负样本 negtoken 类型各类特征时间特征相关原始时间戳 MyTestDataset 读取测试/推理数据,产出 用户序…...
永磁同步电机双矢量模型预测电流MPCC控制仿真:传统与现代控制策略的对比分析
永磁同步电机双矢量模型预测电流MPCC控制仿真【参考文献】 (1)参考文献:《永磁同步电机鲁棒双矢量模型预测电流控制_郭鑫》 (2)描述:传统单矢量预测电流控制在单个控制周期内只能输出单个电压矢量ÿ…...
CLIP-GmP-ViT-L-14入门指南:ViT-L-14主干网络结构与特征提取流程
CLIP-GmP-ViT-L-14入门指南:ViT-L-14主干网络结构与特征提取流程 1. 项目概述 CLIP-GmP-ViT-L-14是一个经过几何参数化(GmP)微调的CLIP模型,在ImageNet和ObjectNet数据集上能达到约90%的准确率。这个模型基于ViT-L-14(Vision Transformer Large 14)主干…...
Rock3A开发板实战:OpenBMC移植全记录(附避坑指南)
Rock3A开发板OpenBMC移植实战:从硬件适配到性能调优 当RK3568处理器遇上OpenBMC,会碰撞出怎样的火花?作为瑞芯微旗下性能与功耗平衡的明星芯片,RK3568在边缘计算领域已证明其价值。而将其应用于BMC(基板管理控制器&…...
CosyVoice Docker Compose 中 model_id 的高效配置与优化实践
最近在部署 CosyVoice 语音服务时,我发现 docker-compose.yml 文件里的 model_id 配置项,虽然看起来只是简单的一行,但配置得当与否,直接关系到整个服务的部署效率、启动速度和资源开销。如果随便填一个值,或者不理解其…...
Cocos解耦移动和发射模块
目标:玩家受到摇杆A控制移动和方向,发射受到摇杆B负责方向和发射 //玩家模块 ccclass(Player) export class Player extends Component {//玩家速度Speed:number 500;//玩家方向property(Vec3)PlayerDir:Vec3;//虚拟摇杆property(Node)Joystick:Node n…...
汽车智能制造时代,哪些服务商助力智慧供应链?
一辆汽车的诞生,背后是一场精密到分钟的大合唱。当生产线以每小时数十台的速度流转时,任何一个零部件的迟到,都可能导致整条线停摆。一个汽车工厂里,单一产线同时生产多种车型,涉及数以万计的SKU零部件。这些物料必须从…...
3大核心功能让你的英雄联盟体验提升300%:League-Toolkit完全指南
3大核心功能让你的英雄联盟体验提升300%:League-Toolkit完全指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 引言…...
