设计模式探索:从理论到实践的编码示例 (软件设计师笔记)
😀前言
设计模式,作为软件工程领域的核心概念之一,向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码,而且也促进了代码的复用性。通过这篇文章,我们将探讨其中一些基本的设计模式,并为每个模式提供相应的代码示例,以便于更好地理解它们的实际应用。
🏠个人主页:尘觉主页
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
在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全局异常处理源码 一、SpringMVC执行流程二、SpringBoot源码跟踪三、自定义优雅的全局异常处理脚手架starter自定义异常国际化引入封装基础异常封装基础异常扫描器,并注册到ExceptionHandler中项目分享以及改进点 一、SpringMVC执行流程 今天这里叙述的全…...
设计模式——7. 装饰者模式
1. 说明 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变对象接口的前提下,动态地将新行为附加到对象上。这种模式是通过创建一个包装(或装饰)对象,将要被装饰的对象包裹起来,从而实现对原有对象功能的增强和扩展。 装饰者模式的主要特点包括:…...
安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识
安卓机型app的编译与反编译 apk文件的简单说明与解析 -安卓修改apk apk的组成和编译 一 电脑端几种反编译apk工具操作步骤解析 前面几个博文有说明关于反编译apk和apk架构等有些常识.今天对以上做个补充。初学者记住一点。对于一个apk文件使用压缩软件7zip打开可以查看到文件…...
Hoeffing不等式
在李航老师的统计学习方法(第一版中) H o e f f i n g 不等式 Hoeffing不等式 Hoeffing不等式是这样子给出的 设 X 1 , X 2 , . . . , X N X_1,X_2,...,X_N X1,X2,...,XN是独立随机变量,且 X i ∈ [ a i , b i ] , i 1 , 2 , . . . ,…...
ffmpeg解复用指定pid转推udp
命令 ffmpeg -re -i udp://224.2.2.2:4003?fifo_size1024000 -map #5001 -acodec copy -flush_packets 1 -f mpegts udp://192.168.2.62:5161 ffmpeg -re -i udp://224.2.2.2:4003?fifo_size1024000 -map #5001 -acodec copy -flush_packets 1 -f mpegts udp://192.16…...
Vue组件通信方式
1.props通信 1.1在 Vue 2 中使用 props 通信 注意:props传递的数据是只读的,子组件修改,不会影响父组件 1.1.1.定义 props 在子组件中使用 props 选项来定义要接收的属性 // 子组件 <script> export default {props: {message: String} } </script>1.1.2.传递…...
redis-设置从节点
节点结构 节点配置文件 主节点 不变 6380节点 port 6380 slaveof 127.0.0.1 63796381节点 port 6381 slaveof 127.0.0.1 6380启动 指定配置文件的方式启动 D:\jiqun\redis\Redis-6380>redis-server.exe redis.windows.conf启动时,会触发同步数据命令 主节点…...
k8s-实战——基于nfs实现动态存储
部署nfs服务 基于Centos7.9版本创建动态存储注意k8s版本应低于v1.24版本高k8s版本ServiceAccount需要手动创建secrets并关联相关sa部署流程 创建NFS共享服务、采用单独的节点用于nfs服务独占安装nfs-utils和rpcbindnfs客户端和服务端都安装nfs-utils包通过部署化脚本安装k8s集群…...
【广州华锐互动】鱼类授精繁殖VR虚拟仿真实训系统
随着科技的不断发展,虚拟现实技术在各个领域的应用越来越广泛。在养殖业中,VR技术可以帮助养殖户进行家鱼授精实操演练,提高养殖效率和繁殖成功率。本文将介绍利用VR开展家鱼授精实操演练的方法和应用。 首先,我们需要了解家鱼授精…...
RocketMQ Promethus Exporter
介绍 Rocketmq-exporter 是用于监控 RocketMQ broker 端和客户端所有相关指标的系统,通过 mqAdmin 从 broker 端获取指标值后封装成 87 个 cache。 警告 过去版本曾是 87 个 concurrentHashMap,由于 Map 不会删除过期指标,所以一旦有 la…...
备案网站名称 怎么填写/电商运营转行后悔了
前端面试题(3) 1、iframe有那些缺点? iframe会阻塞主页面的Onload事件;搜索引擎的检索程序无法解读这种页面,不利于SEO;iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页…...
做网站设计需要学会哪些/网页设计html代码大全
Jquery中的选择器分为几大类:基本过滤选择器,层次选择器,内容过滤选择器,可见性过滤选择器,属性过滤选择器,子元素过滤选择器,表单对象选择器和表单对象属相过滤选择器。 1.非基本过滤选择器&am…...
乐山网站制作公司/百度推广怎么赚钱
诀窍1 酒桌上虽然“感情深,一口闷;感情浅,舔一舔”但喝酒的时候决不能把这句话挂在嘴上。 诀窍2 韬光养晦,厚积薄发,切不可一上酒桌就充大。 诀窍3 领导相互喝完才轮到自己敬。 诀窍4 可以多人敬一人,决不可…...
remal wordpress/优化营商环境心得体会个人
16.1.3 Docker对网络的支持 Container network interface(CNI) 16.1.4 Docker跨主机通信方案总结 Bridge网络:docker0就是默认的桥接网络 Docker网络驱动: Overlay:是基于VXLAN、NVGRE等封装技术实现overlay叠加网络 Macvlan:基于Docker宿主机物理网卡的不同子接…...
百度网站怎么做视频播放器/首页图片点击率如何提高
1、Viasfora (关键字跟括号其他的高亮清晰分类) 2.ClaudiaIDE (VS代码背景替换也可以换自己想要的图片) 3.VSCommands for Visual Studio 2013 代码显示增强:它可以在尾部显示方法或过程名字 4.Indent Guides &#x…...
新人如何自学做网站/seo基础入门免费教程
点击上方“蓝色字”可关注我们!暴走时评:奥地利政府将使用以太坊区块链公证价值11.5亿欧元(约合13亿美元)的政府债券拍卖,联邦政府财政局(OeBFA)已指派银行业巨头Oesterreichische Kontrollbank…...