高频设计模式

文章目录

  • 高频设计模式
  • 单例模式
    • 饿汉式(Eager Initialization)
    • 懒汉式(Lazy Initialization)
    • 双重校验锁(Double-Checked Locking)
    • 静态内部类(Static Inner Class)
    • 枚举(Enum)
  • 工厂模式
    • 简单工厂模式
    • 工厂方法模式

高频设计模式

设计模式是解决常见问题的模板,它们被广泛应用于软件设计中以提高代码的可重用性、可维护性和可扩展性。以下是一些在Java中高频使用的设计模式:

  • 单例模式(Singleton):
    确保一个类只有一个实例,并提供一个全局访问点。
  • 工厂模式(Factory Method):
    定义一个接口用于创建对象,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
  • 抽象工厂模式(Abstract Factory):
    提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
  • 建造者模式(Builder):
    将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 原型模式(Prototype):
    通过复制现有的实例来创建新的实例,而不是通过构造函数创建。
  • 适配器模式(Adapter):
    将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以一起工作。
  • 装饰器模式(Decorator):
    动态地给一个对象添加一些额外的职责。就扩展功能而言,装饰器模式比继承更灵活。
  • 代理模式(Proxy):
    为其他对象提供一种代理以控制对这个对象的访问。
  • 外观模式(Facade):
    提供一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。
  • 桥接模式(Bridge):
    将抽象部分与实现部分分离,使它们都可以独立地变化。
  • 组合模式(Composite):
    将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使用户对单个对象和组合对象的使用具有一致性。
  • 享元模式(Flyweight):
    运用共享技术有效地支持大量细粒度的对象。
  • 策略模式(Strategy):
    定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
  • 模板方法模式(Template Method):
    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 观察者模式(Observer):
    当一个对象状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
  • 状态模式(State):
    允许对象在内部状态改变时改变其行为,对象看起来好像修改了其类。
  • 命令模式(Command):
    将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。
  • 责任链模式(Chain of Responsibility):
    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
  • 中介者模式(Mediator):
    定义一个对象来封装一组对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  • 迭代器模式(Iterator):
    提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露其内部的表示。

单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在某些场景下,只有一个实例是很重要的,比如在共享资源或管理共享状态时,只有一个实例可以避免冲突和错误。
在Java中,实现单例模式有多种方式,以下是一些常见的实现方法:

饿汉式(Eager Initialization)

在这种方式中,单例对象在类加载时就被创建。

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数}public static Singleton getInstance() {return instance;}
}

这种方式简单,但可能在类加载时就创建了实例,即使这个实例不会被使用。

懒汉式(Lazy Initialization)

在这种方式中,单例对象在第一次使用时才被创建。

public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

这种方式延迟了实例的创建,但它在多线程环境下不是线程安全的。

双重校验锁(Double-Checked Locking)

这种方式结合了懒汉式和同步锁,以确保在多线程环境下只有一个实例被创建。

public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

注意,这里使用了volatile关键字来确保,当instance变量被初始化成Singleton实例时,多个线程正确地处理instance变量。

静态内部类(Static Inner Class)

这种方式利用Java类加载机制来保证单例对象的唯一性。

public class Singleton {private Singleton() {// 私有构造函数}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

这种方式是线程安全的,并且只有在调用getInstance()方法时才会创建单例对象。

枚举(Enum)

使用枚举实现单例是最简单的方法,也是实践中推荐的方式。

public enum Singleton {INSTANCE;public void doSomething() {// 执行一些操作}
}

工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,用于处理对象的创建逻辑。工厂模式定义了一个接口用于创建对象,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
在简单工厂模式中,一个工厂类根据传入的参数来决定创建哪一种产品类的实例。而在工厂方法模式中,工厂类本身被抽象化,使得不仅可以通过子类来决定创建哪一种产品类的实例,而且可以进一步将实例化的逻辑委托给子类。

简单工厂模式

简单工厂模式有一个工厂类,根据传入的参数来决定创建哪一种产品类的实例。

public interface Product {void show();
}public class ConcreteProductA implements Product {@Overridepublic void show() {System.out.println("我是产品A");}
}public class ConcreteProductB implements Product {@Overridepublic void show() {System.out.println("我是产品B");}
}public class SimpleFactory {public Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}return null;}
}public class Client {public static void main(String[] args) {SimpleFactory factory = new SimpleFactory();Product productA = factory.createProduct("A");productA.show();Product productB = factory.createProduct("B");productB.show();}
}

工厂方法模式

工厂方法模式将工厂类抽象化,使得不仅可以通过子类来决定创建哪一种产品类的实例,而且可以进一步将实例化的逻辑委托给子类。

public abstract class Factory {abstract public Product createProduct();
}public class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}public class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}public class Client {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.show();Factory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.show();}
}

工厂模式的好处是它提供了一个统一的接口来创建对象,使得客户端不需要知道具体的类名,从而降低了客户端与具体产品类之间的耦合。这使得添加新产品更加容易,只需要添加一个新的具体产品类和对应的工厂类即可,不需要修改现有的代码。

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

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

相关文章

LeetCode-1004. 最大连续1的个数 III

每日一题系列(day 20) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50…

软考高级:耦合分类(内容耦合、公共耦合、外部耦合等)概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Vue3 子/父组件相互调用

1&#xff1a;子组件调用父组件 父组件&#xff1a; <template><div><button style"margin: 50px">父按钮</button> <!--已clk为名称的事件传递给子组件&#xff0c;传递的是父组件的a函数/事件 --><Child clk"a" />…

huggingface实现Bark模型

目录 引言 使用半精度 使用CPU卸载 使用Better Transformer 使用Flash Attention 2 安装 使用 组合优化技术 使用技巧 BarkConfig 实例化 BarkConfig 参数说明 BarkProcessor 参数 __call__ 方法 from_pretrained 方法 save_pretrained 方法 BarkModel 生成…

电脑解锁后黑屏有鼠标--亲测!!不需要重装系统!!

问题&#xff1a;上周电脑黑屏&#xff0c;只有鼠标&#xff0c;鼠标还不能右键&#xff01;&#xff01; 中招&#xff1a;win10系统最新版火绒安全 &#xff0c;那你有概率获得开机黑屏套餐一份。 原因是&#xff1a;火绒把我们的explorer删除了导致黑屏&#xff0c;这个文…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的…

1分钟带你学会使用装饰器编写Python函数

1.需求 向 test() 函数中&#xff0c;新增一个功能&#xff0c;多输出一句话"给他补铁" def test():print("水中放吸铁石") # test()# 第一种方式&#xff1a;重写函数 def test():print("水中放吸铁石")print("给他补铁") test()# …

Hibernate是如何处理事务的?请描述一下Hibernate的事务管理。Hibernate中的缓存机制是怎样的?如何配置和使用缓存?

Hibernate是如何处理事务的&#xff1f;请描述一下Hibernate的事务管理。 Hibernate是一个强大的Java ORM框架&#xff0c;它提供了对数据库事务的透明管理。Hibernate的事务管理基于Java的JTA&#xff08;Java Transaction API&#xff09;和JDBC&#xff08;Java Database Co…

什么是移动计算?中国Java之父余胜军被刷爆的CDN又是什么?

移动计算 移动计算通常指的是将计算任务从其原始位置转移到距离数据存储地更近的地点进行处理的概念。这个概念基于一个核心原则&#xff1a;数据传输的成本&#xff08;包括时间、带宽和资源消耗&#xff09;通常高于将计算任务移动到数据所在位置的成本。因此&#xff0c;移…

自增自减运算符 i++,++i,i--,--i小窍门

符号在前就先加/减&#xff0c;符号在后就后加/减 在写代码的过程中&#xff0c;常见的一种情况是需要某个整数类型变量增加 1 或减少 1&#xff0c;Java 提供了一种特殊的运算符&#xff0c;用于这种表达式&#xff0c;叫做自增运算符&#xff08;)和自减运算符&#xff0…

py脚本模拟json数据,StructuredStreaming接收数据存储HDFS一些小细节 ERROR:‘path‘ is not specified

很多初次接触到StructuredStreaming 应该会写一个这样的案例 - py脚本不断产生数据写入linux本地&#xff0c; 通过hdfs dfs 建目录文件来实时存储到HDFS中 1. 指定数据schema&#xff1a; 实时json数据 2. 数据源地址&#xff1a;HDFS 3. 结果落地位置&#xff1a; HDFS …

高级语言讲义2010软专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

NOIP2004 提高组 津津的储蓄计划(选自洛谷P1089)

题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300300 元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随时把整百的钱存在她那里&#xff0c;到…

PCB检测,基于YOLOV8NANO

PCB检测&#xff0c;基于YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;转换成ONNX&#xff0c;只需要OPENCV&#xff0c;支持C/PYTHON/ANDROID开发PCB检测&#xff0c;基于YOLOV8NANO&#xff0c;只需要OPENCV

每日一题leetcode第2834:找出美丽数组的最小和

目录 一.题目描述 二.思路及优化 三.C代码 一.题目描述 二.思路及优化 首先我们看到这个题&#xff0c;就是根据给出的数组元素个数N&#xff0c;从[1&#xff0c;N]找出N个元素&#xff0c;使得N个元素的和最小&#xff0c;其中随便抽两个数出来&#xff0c;两个数之和不能为…

如何查看resnet网络的中间输出特征和卷积核的参数

查看中间层的特征&#xff0c;需要在定义Model时&#xff0c;在forward时&#xff0c;将中间要显示的层输出。 def forward(self, x):outputs []x self.conv1(x)outputs.append(x)x self.bn1(x)x self.relu(x)x self.maxpool(x)x self.layer1(x)outputs.append(x)# x se…

基于MapReduce的汽车数据清洗与统计案例

数据简介 ecar168.csv&#xff08;汽车销售数据表&#xff09;&#xff1a; 字段数据类型字段说明rankingString排名manufacturerString厂商vehicle_typeString车型monthly_sales_volumeString月销量accumulated_this_yearString本年累计last_monthString上月chain_ratioStri…

BC134 蛇形矩阵

一&#xff1a;题目 二&#xff1a;思路分析 2.1 蛇形矩阵含义 首先&#xff0c;这道题我们要根据这个示例&#xff0c;找到蛇形矩阵是怎么移动的 这是&#xff0c;我们可以标记一下每次移动到方向 我们根据上图可以看出&#xff0c;蛇形矩阵一共有两种方向&#xff0c;橙色…

【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载

【Pytorch】新手入门&#xff1a;基于sklearn实现鸢尾花数据集的加载 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…