创建型

单例模式

  • 饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){ }
public static Singleton getInstance() {
return instance;
}
}

评价:在类加载的时候就实例化了对象,而不是当使用它的时候才实例化,会预先占用内存空间,但这在一定的场景下也说不上是缺点,例如:实例化这个单例有磁盘io的操作,如果当使用它的时候才实例化的话就非常影响性能,同时多线程获取单例非常快,不存在竞争的问题,

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

评价:不需要预先的内存开销,当使用它的时候才实例化,但是多线程获取单例的时候会有锁的竞争,效率很低

  • 双重校验锁
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

评价:比懒汉式的效率要高,在实例化对象的时候才会有多线程的竞争

  • 静态内部类
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
} public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}

评价:由于类加载过程只能有一个线程来进行并完成静态代码块的初始化所以是线程安全的,并且静态内部类的静态变量在外部类加载的时候并不会初始化这就避免了预先占用内存,和DCL相比,DCL用了volatile并且还有不为null的判断

  • 枚举(推荐)
public enum Singleton {
INSTANCE
}

评价:实现简单,线程安全,获取单例效率高,避免了反射或者序列化破坏单例的情况(前面四种都会发生参考:https://www.cnblogs.com/ttylinux/p/6498822.html?utm_source=itdadao&utm_medium=referral http://www.importnew.com/18030.html http://blog.jobbole.com/94074/)

工厂模式

  • 图例

  • 简单工厂模式

  • 工厂模式

  • 简单工厂VS工厂

相同

工厂负责产品类的创建,使用者需要使用产品类的时候直接请求工厂就与产品类复杂的创建和实现分离了,只关注它的接口,只要它的接口满足使用者要求就不会影响上层模块,后期当产品类变化时,维护起来也比较方便

不同

简单工厂:一个工厂类负责所有产品的生产,当有新的子类产品时,需要修改工厂类,这违背了开闭原则

工厂:抽象出了一个抽象工厂类,每个实际工厂类对应一个实际产品的生产,当有新的子类产品时,只需增加工厂子类即可,增加了灵活性

抽象工厂模式

结构型

适配器模式

装饰者模式

外观模式

代理模式

行为型

策略模式

模版模式

Spring中的设计模式

  • 模板方法模式以及hook方法的应用

    BeanFactory提供了getBean接口,在子类AbstractBeanFactory中重写了getBean,具体内容是bean没有实例化对象的话,就先实例化再依赖注入,依赖注入需要调用applyProperty函数,在AbstractBeanFactory中该函数为空,留给子类来实现。比如对于构造注入,setter注入,Field注入写不同的实现类

  • 工厂方法模式的应用

    Spring的主要思想ioc就是指将对象的创建权利移交给工厂,主要实现是: BeanFactory是个抽象工厂,其子类实现getBean方法决定如何对类进行实例化并返回对象,使用者需要某个对象的时候直接请求BeanFactory让它去加载,就与该类复杂的创建和实现分离了,使用者只关注它的接口,只要它的接口满足使用者要求就不会影响上层模块,后期当产品类变化时,维护起来也比较方便

  • 外观(门面)模式的运用

    Spring有几个重要的模块:比如Resouce,BeanDefinitionReader,BeanFactory,ApplicationContext集成了这几个模块的功能,直接通过ApplicationContext就可以对资源进行定位,加载,管理

  • 代理模式的运用

    通过jdk的动态代理:jdk的动态代理是基于接口的,被代理类必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理。

    通过cglib动态代理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

  • 单例模式的运用

    Spring中如果指定bean的类型为singleton,那么每次getBean会从hashmap中取,如果取不到先就实例化后放入hashmap中去

  • 策略模式

    Spring对资源访问的封装是策略模式的经典实现,spirng使用Resource接口来抽象资源,代表资源访问策略,其子类分别实现了不同的策略,例如:UrlResource:访问网络资源的实现类。ClassPathResource:访问类路径资源。FileSystemResource:访问文件系统资源。客户端程序只和 Resource 接口耦合,而与具体的访问策略解耦,可以在策略之中自由切换。

mini设计模式的更多相关文章

  1. PHP设计模式:抽象工厂

    示例代码详见https://github.com/52fhy/design_patterns 抽象工厂 抽象工厂(Abstract Factory)是应对产品族概念的.比如说,每个汽车公司可能要同时生 ...

  2. ABAP设计模式——适配器

    计算机科学中的大多数问题都可以通过增加一层间接性来解决.  ——David Wheeler 适配器模式(Adapter Design Pattern),是一个广泛应用于真实世界和面向对象编程语言的设计 ...

  3. Pig设计模式概要以及与SQL的设计模式的对比

    2019独角兽企业重金招聘Python工程师标准>>> 1概要模式 概要模式其实就是数据的全貌信息的获取,主要分为3种: 1.1数值概要 #HSQL SELECT MIN(num), ...

  4. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

  5. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  6. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  7. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  8. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  9. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

随机推荐

  1. SSE图像算法优化系列十六:经典USM锐化中的分支判断语句SSE实现的几种方法尝试。

    分支判断的语句一般来说是不太适合进行SSE优化的,因为他会破坏代码的并行性,但是也不是所有的都是这样的,在合适的场景中运用SSE还是能对分支预测进行一定的优化的,我们这里以某一个算法的部分代码为例进行 ...

  2. Mysql查询某字段值重复的数据

    查询user表中,user_name字段值重复的数据及重复次数 select user_name,count(*) as count from user group by user_name havi ...

  3. 关于Frame加背景的那点事?

    最近新生问我一个问题,继承自Frame(可不是继承自JFrame)的框架怎样添加背景图片, 真够坑的,当时还真懵了,废话少说直接上代码: import java.awt.*; import java. ...

  4. 高可用的MongoDB集群

    1.序言 MongoDB 是一个可扩展的高性能,开源,模式自由,面向文档的数据库. 它使用 C++编写.MongoDB 包含一下特点: l  面向集合的存储:适合存储对象及JSON形式的数据. l ...

  5. HDU 6035(树形dp)

    题意略. 思路:有n * (n - 1) / 2这么多边,要枚举是不可能的,感觉和数据结构也沾不上边.再加上树上染色,以一条边上不同颜色作为这个边的值,这看起来像是算贡献那种题,和17icpc沈阳的某 ...

  6. [记录]CentOS搭建SVN服务器(主从同步)

    CentOS搭建SVN服务器(主从同步)1.安装步骤如下: 1)安装: #yum install subversion 2)查看安装位置: #rpm -ql subversion 3)查看版本: #/ ...

  7. Spring Boot:Consider defining a bean of type '*.*.*' in your configuration解决方案

    果然不看教程直接使用在遇到问题会懵逼,连解决问题都得搜半天还不一定能帮你解决了... ***************************APPLICATION FAILED TO START*** ...

  8. bzoj 3166 [Heoi2013]Alo 可持久化Trie

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1227  Solved: 569[Submit][Status ...

  9. bzoj 1307/1318 玩具 线段树+记录时间戳

    玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 743  Solved: 404[Submit][Status][Discuss] Descrip ...

  10. 安装 LightGBM 包的过程

    conda install cmake conda install gcc git clone --recursive https://github.com/Microsoft/LightGBM ; ...