Java常见设计模式

单例模式:程序自始至终只创建一个对象。

应用场景:1.整个程序运行中只允许一个类的实例时

2.需要频繁实例化然后销毁的对象

3.创建对象时耗时过多但又经常用到的对象

4.方便资源相互通信的环境

懒汉式线程不安全问题解决方案:

双重检查加锁机制:

既可实现线程安全,又可使性能不受到很大的影响,所谓"双重检查"指的是并非每次调用getInstance方法都需要同步,进入方法后先检查实例是否存在,不存在的情况下才进入下面的同步块,这是第一层检查。进入同步块后再次进行检查实例是否存在,如果不存在则在同步块内创建实例,这是第二次检查。

双重检查机制实现会使用volatile,它的意思是被volatile修饰的变量的值将不会被本地缓存,所有对该变量的读写都直接操作共享内存,从而确保多个线程能正确处理该变量。

public class LazySingleton {

private static volatile LazySingleton dl = null;

private LazySingleton() {

}

public static LazySingleton getInstance() {

if (dl == null) {

synchronized (LazySingleton.class) {

if (dl == null) {

dl = new LazySingleton();

}

}

}

return dl;

}

}

内部类解决(延迟加载,线程安全):

public class SingletonInner {

/**

* 内部类实现单例模式

* 延迟加载,减少内存开销

*/

private static class SingletonHolder {

private static SingletonInner instance = new SingletonInner();

}

/**

* 私有的构造函数

*/

private SingletonInner() {}

public static SingletonInner getInstance() {

return SingletonHolder.instance;

}

protected void method() {

System.out.println("SingletonInner");

}

}

单例模式实际应用:

1.Spring中bean默认是单例模式

2.网站的计数器

3.应用程序的日志应用

4.web应用的配置读取,由于配置文件是共享的资源。

5.数据库连接池设计

6.多线程的线程池

2.工厂模式:这是一种创建型模式,它提供了一种创建对象的最佳方式,通过一个共通的接口来指向新创建的对象,创建对象不再是由当前类实例化,而是由工厂类完成,在工厂中只需告知对象类型即可,工厂模式中必须依赖接口。

实际应用:1.数据库工厂(不同语言)

3.观察者模式:当一个对象被其他多个对象所依赖,当一个对象发生变化时,其他依赖该对象的对象都会收到通知并随着变化,比如警报、微信公众号推送,自动通知每个订阅的客户

4.代理模式:一个代理类代表一个真实类的访问

实际应用:1.数据库工厂(不同语言)

5.适配器模式:用于解决软件实体间的接口不兼容问题。

6.策略模式:定义一系列算法将它们统一封装起来并且使他们可以相互替换,策略模式的重心不是如何实现这些算法,而是如何组织、调用这些算法,使程序更灵活、可维护、可扩展

7.职责链模式(请假流程):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。在职责链模式中很多对象由某一个对象对下家的引用而连接起来形成一条链,请求在这个链上传递,直到链上的某个对象处理此请求

8.模版方法模式:由两部分组成,抽象父类和具体的子类完成,通常在抽象父类中封装了子类的算法框架,包括一些公共方法以及子类的方法执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类中的方

相关推荐
掐指一算乀缺钱9 分钟前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑14 分钟前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
就这个java爽!19 分钟前
JAVA网络编程【基于TCP和UDP协议】超详细!!!
java·开发语言·网络·tcp/ip·udp·eclipse·idea
一叶飘零_sweeeet24 分钟前
为什么 Feign 要用 HTTP 而不是 RPC?
java·网络协议·http·spring cloud·rpc·feign
懒洋洋大魔王44 分钟前
7.Java高级编程 多线程
java·开发语言·jvm
茶馆大橘1 小时前
【黑马点评】已解决java.lang.NullPointerException异常
java·开发语言
星辰@Sea1 小时前
服务注册中心对比及使用场景分析
java·云原生
马剑威(威哥爱编程)1 小时前
除了递归算法,要如何优化实现文件搜索功能
java·开发语言·算法·递归算法·威哥爱编程·memoization
bug菌¹1 小时前
滚雪球学SpringCloud[4.1讲]: Spring Cloud Gateway详解
java·spring cloud·微服务
MuseLss1 小时前
HashMap高频面试知识点
java·开发语言·哈希算法