代码先锋网 代码片段及技术文章聚合

Java常见设计模式

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点

懒汉式

public class Singleton {  
    /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */  
    private static Singleton instance = null;  
  
    /* 私有构造方法,防止被实例化 */  
    private Singleton() {}  
  
    /* 1:懒汉式,静态工程方法,创建实例 */  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}  

调用:
Singleton.getInstance().method();
优点:延迟加载(需要的时候才去加载),适合单线程操作
缺点: 线程不安全,在多线程中很容易出现不同步的情况,如在数据库对象进行的频繁读写操作时。

饿汉模式

在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快

public class EagerSingleton {
    //饿汉单例模式
    //在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
    private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化

    private EagerSingleton() 
    {
        //私有构造函数
    }
    public static EagerSingleton getInstance()    //静态,不用同步(类加载时已初始化,不会有多线程的问题)
    {
        return instance;
    }
}

双重线程检查模式

public class SingletonInner {  
    private static volatile SingletonInner sInst = null;  // <<< 这里添加了 volatile  
  
    /** 
     * 私有的构造函数 
     */  
    private SingletonInner() {}  
  
    public static SingletonInner getInstance() {  
        SingletonInner inst = sInst;  // <<< 在这里创建临时变量
        if (inst == null) {
            synchronized (SingletonInner.class) {
                inst = sInst;
                if (inst == null) {
                    inst = new SingletonInner();
                    sInst = inst;
                }
            }
        }
        return inst;  // <<< 注意这里返回的是临时变量
    }
    protected void method() {  
        System.out.println("SingletonInner");  
    }  
}  

volatile
可见性(volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新)
防止指令重排序(赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障)
调用:
Singleton.getInstance().method();
优点:延迟加载,线程安全
缺点:写法复杂,不简洁

内部类模式

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");  
    }  
} 

调用:
Singleton.getInstance().method();
优点:延迟加载,线程安全(java中class加载时互斥的),也减少了内存消耗,推荐使用内部类方式。

版权声明:本文为weixin_34110749原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34110749/article/details/87506722

智能推荐

java常见设计模式清单

1. 代理模式 为其他对象提供一种代理以控制对这个对象的访问。 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。 代理模式分为静态代理,动态代理以及Cglib代理三种 1. 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类,然后...

java常见的设计模式

一.单例设计模式 定义 Singleton是一种创建型模式,指某个类使用了Singleton模式,则这个类被创建后,只能产生一个实例供外部访问,并且提供一个全局的访问点。单例设计模式指的就是无论程序如何运行,采用单例设计模式的类(Singleton)永远都只会有一个实例化对象产生。 具体实现步骤 具体实现步骤如下: 1.在其内部产生该类的实例化对象,并将其封装成private static类型; ...

荐:Java常见设计模式

设计模式的原则: 1、开闭原则 对扩展开放,对修改关闭。  2、依赖倒置原则 通过抽象使各个类或者模块不相互影响,实现松耦合。  3、单一职责原则 一个类、接口、方法只做一件事。  4、接口隔离原则 尽量保证接口的纯洁性,客户端不应该依赖不需要的接口。  5、迪米特法则 又叫最少知道原则,一个类对其所依赖的类知道得越少越好。 6、里氏替换原则 子类可以扩展父...

Java常见的几种设计模式

原文链接:https://www.cnblogs.com/xiaofengwang/p/11255678.html 单例模式 简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。...

猜你喜欢

Java常见的设计模式

1.单例模式 作用:保证整个应用中某个实例 饿汉模式 懒汉模式 区别:饿汉模式在加载类时就会创建实例,所以加载类比较慢,但运行时获取对象较快,线程安全。懒汉模式则相反,加载类较快,获取对象时较慢,线程不安全。 拓展点:懒汉模式线程不安全点在于当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。这就引出了双重检验锁。 使用volatile修饰的原因:instance = ne...

Java常见几种设计模式

什么是设计模式? 设计模式是可以重复利用的解决方案。软件开发的先辈们将在开发过程中遇到的问题进行总结,并给出解决方案。后辈在遇到类似问题时,可以使用这些方案解决问题。(从设计模式可以看出,先辈们对于接口的应用。) • 单例模式(ps:参考https://www.cnblogs.com/xiaofengwang/p/11255678.html) 一个类只有一个实例对象。这个对象的构造器被p...

java中常见的设计模式

简单工厂/静态工厂 单例模式 分为饿汉式,懒汉式 饿汉式 懒汉式 静态代理 抽象卖票方法 火车站卖票具体方法 中介 可对卖票方法进行增强 客户 另外 cjlib代理、jdk代理和静态代理很像 spring aop也是基于此实现的...

常见设计模式

1. 写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。 2. 使用发布订阅模式写一个事件管理器,可以实现如下方式调用...

常见设计模式

例题1:写一个Singleton出来。         答案:Singleton模式的主要作用是保证在java应用程序中,一个类Class只有一个实例存在。                   Singleton模式通常有两种形式。 第一种形式:定义一个类,它的构造函数...