java常用设计模式介绍及代码示例

设计模式是在软件设计中发现、研究和应用的一种有效方法。设计模式并不直接转化成代码,而是提供了解决某一问题的框架。下面介绍一些常用的设计模式以及对应的Java代码示例:

1. 单例模式:确保某一个类只有一个实例,同时提供一个访问它的全局访问点。

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

2. 工厂模式:提供一个创建对象的接口,允许将实例化的逻辑延迟到子类进行。

abstract class Product {
}
class ProductA extends Product {
}
class ProductB extends Product {
}abstract class Factory {abstract Product createProduct();
}class FactoryA extends Factory {Product createProduct() {return new ProductA();}
}class FactoryB extends Factory {Product createProduct() {return new ProductB();}
}

3. 观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

import java.util.ArrayList;
import java.util.List;interface Observer {void update();
}class ConcreteObserver implements Observer {public void update() {}
}interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();public void registerObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update();}}
}

4. 建造者模式:将一个复杂对象的构建与它的表现分离,以使得同样的构建过程可以创建不同的表现。

class Product {private String partA;private String partB;// ... 省略 getter 和 setter 方法 ...
}abstract class Builder {protected Product product = new Product();public abstract void buildPartA();public abstract void buildPartB();public Product getProduct() {return product;}
}class ConcreteBuilder extends Builder {public void buildPartA() {product.setPartA("A");}public void buildPartB() {product.setPartB("B");}
}class Director {public void construct(Builder builder) {builder.buildPartA();builder.buildPartB();}
}

5. 适配器模式:将一个类的接口转换成用户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以脱离。

interface Target {void request();
}class Adaptee {void specificRequest() {// 实现具体功能}
}class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();}
}

6. 策略模式:定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。

interface Strategy {void algorithmInterface();
}class ConcreteStrategyA implements Strategy {public void algorithmInterface() {// 具体算法 A}
}class ConcreteStrategyB implements Strategy {public void algorithmInterface() {// 具体算法 B}
}class Context {Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void contextInterface() {strategy.algorithmInterface();}
}

 

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

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

相关文章

java流式计算Stream

java流式计算Stream 流(Stream)到底是什么呢? 是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。 “集合讲的是数据&#xff0c;流讲的是计算! ” 特点&#xff1a; Stream自己不会存储元素。 Stream不会改变源对象。相反&#x…

金三银四面试题(十六):MySQL面试都问什么(1)

在开发岗位面试中&#xff0c;MySQL基本是必考环节。所以接下来我们就进入MySQL八股文环节&#xff0c;看看都有哪些高频考题。 MySQL 中有哪些不同的表格&#xff1f; 在MySQL中&#xff0c;可以创建多种不同类型的表格&#xff0c;其中一些常见的类型包括&#xff1a; InnoD…

代码随想录第18天: 二叉树part05

力扣513 找树左下角的值 class Solution {public int findBottomLeftValue(TreeNode root) {Queue<TreeNode> que new LinkedList<>();que.offer(root);int res 0;while(!que.isEmpty()) {int size que.size();for(int i 0; i < size; i) {TreeNode tmp q…

Git(8)之分支间同步特定提交

Git(8)之分支间同步特定提交 Author&#xff1a;Once Day Date&#xff1a;2024年4月7日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSDN博客 文章目录 Git(8)之分支间同步特定提交1. 分支间同步提交2. cherry-pick同步分支间的特定提交…

docker打包haproxy并代理web或mysql集群

1、需求&#xff1a; 使用haproxy代理两个服务&#xff08;web服务或者是mysql服务&#xff09; 2、编写Dockerfile 2.1、创建Dockerfile专用目录 mkdir /docker/images/haproxy -p && cd /docker/images/haproxy 2.2、下载软件包到Dockerfile专用目录 curl -O h…

性能优化-如何爽玩多线程来开发

前言 多线程大家肯定都不陌生&#xff0c;理论滚瓜烂熟&#xff0c;八股天花乱坠&#xff0c;但是大家有多少在代码中实践过呢&#xff1f;很多人在实际开发中可能就用用Async&#xff0c;new Thread()。线程池也很少有人会自己去建&#xff0c;默认的随便用用。在工作中大家对…

ThingsBoard通过MQTT发送属性数据

MQTT基础 客户端 MQTT连接 属性上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…

3D打印技术引领压铸模具制造新变革

随着工业4.0浪潮的席卷&#xff0c;3D打印技术以其独特优势&#xff0c;正逐渐成为新一轮工业革命中的璀璨明星。这一技术不仅为“中国制造”向“中国智造”的转型提供了强大动力&#xff0c;也为压铸模具这一铸造行业的重要分支带来了前所未有的变革。 压铸模具&#xff0c;作…

文心一言指令词宝典之咨询分析篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

深入浅出理解ArrayBuffer对象TypedArray和DataView视图

目录 举例理解 1. ArrayBuffer对象 2. TypedArray 3. DataView 总结 具体讲解 1. ArrayBuffer对象 2. TypedArray 3. DataView 注意事项 举例理解 先举个简单的例子理解ArrayBuffer对象TypedArray和DataView视图的概念和之间的关系 1. ArrayBuffer对象 想象一个场景…

2024.2.17力扣每日一题——N叉树的层序遍历

2024.2.17 题目来源我的题解方法一 广度优先搜索&#xff08;队列实现&#xff09; 题目来源 力扣每日一题&#xff1b;题序&#xff1a;429 我的题解 方法一 广度优先搜索&#xff08;队列实现&#xff09; 和二叉树的层序遍历相同&#xff0c;只是在添加子节点的细节有所不…

NAT网络地址转换原理解析

NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换&#xff0c;是一种在1994年提出的地址转换技术。它的主要目的是在本地网络中使用私有地址&#xff0c;在连接互联网时转而使用全局IP地址。NAT实际上是为解决IPv4地址短缺而开发的技术。NAT…

MBTI测试背后的心理学原理:为什么它能揭示你的职业性格?(包含开源免费的API接口)

MBTI简介 迈尔斯-布里格斯类型指标&#xff08;Myers–Briggs Type Indicator&#xff0c;MBTI&#xff09;是由美国作家伊莎贝尔布里格斯迈尔斯和她的母亲凯瑟琳库克布里格斯共同制定的一种人格类型理论模型。 该指标以瑞士心理学家卡尔荣格划分的8种心理类型为基础&#xff…

[算法前沿]--022-使用 StarCoder 创建一个编程助手

文章目录 StarCoder调优测试StarCoder BigCode 开发的 StarCoder,这是一个在一万亿的 token、80 多种编程语言上训练过的 16B 参数量的模型。训练数据多来自 GitHub 上的 issues、使用 Git 提交的代码、Jupyter Notebook 等等 。得益于对企业友好的许可证、长度为 8192 的 to…

Mojo编程语言案例及介绍

Mojo是一种新兴的编程语言&#xff0c;它结合了现代编程范式与简洁易读的语法&#xff0c;为开发者提供了一个强大且高效的开发工具。以下将详细介绍Mojo编程语言的特性&#xff0c;并通过一个实际案例来展示Mojo的应用。 一、Mojo编程语言介绍 Mojo编程语言的设计理念是“简单…

以诚待人,用心做事,做到最好,追求更好

无数个日日夜夜&#xff0c;终于换来了这样一份努力的证明。 2023年&#xff0c;收获满满&#xff0c;前一阵子拿到了证书&#xff0c;忘记拍照了&#xff0c;今天抽空记录一下 收获&#xff01;又得到一份肯定&#xff0c;这份荣誉证书将伴随我一直为了进步而奋斗&#xff1a…

基于SSM的基于个人需求和地域特色的外卖推荐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的基于个人需求和地域特色的外卖推荐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

非关系型数据库(缓存数据库)redis的集群

目录 一.群集模式——Cluster 1.原理 2.作用 3.特点 4.工作机制 哈希槽 哈希槽的分配 哈希槽可按照集群主机数平均分配&#xff08;默认分配&#xff09; 根据主机的性能以及功能自定义分配 redis集群的分片 分片 如何找到给定key的分片 优势 二. 搭建Redis群集…

TAB标签美化 - SVG作为mask

今天觉得V3的标签不是很好看&#xff0c;忽然想起来之前看过Vue Admin Beautiful Pro的样式挺好的&#xff0c;顺手研究了一把。发现Vue Admin Beautiful是采用PNGmask css来解决的。于是乎打算把V3的标签页做点小美化&#xff0c;但是迁移过程发生些小插曲&#xff0c;在此记录…

探索自然语言处理:简单而完整的学习路线指南

引言&#xff1a; 自然语言处理&#xff08;NLP&#xff09;作为人工智能和语言学的交汇点&#xff0c;正在彻底改变我们与技术的互动方式。从Siri到Google翻译&#xff0c;NLP技术已成为现代生活的不可或缺的一部分。本文旨在为初学者提供一个简单而全面的NLP学习路径&#xf…