保证一个类仅有一个实例,并提供一个访问它的全局访问点
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加载时互斥的),也减少了内存消耗,推荐使用内部类方式。
1. 代理模式 为其他对象提供一种代理以控制对这个对象的访问。 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。 代理模式分为静态代理,动态代理以及Cglib代理三种 1. 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类,然后...
一.单例设计模式 定义 Singleton是一种创建型模式,指某个类使用了Singleton模式,则这个类被创建后,只能产生一个实例供外部访问,并且提供一个全局的访问点。单例设计模式指的就是无论程序如何运行,采用单例设计模式的类(Singleton)永远都只会有一个实例化对象产生。 具体实现步骤 具体实现步骤如下: 1.在其内部产生该类的实例化对象,并将其封装成private static类型; ...
...
设计模式的原则: 1、开闭原则 对扩展开放,对修改关闭。 2、依赖倒置原则 通过抽象使各个类或者模块不相互影响,实现松耦合。 3、单一职责原则 一个类、接口、方法只做一件事。 4、接口隔离原则 尽量保证接口的纯洁性,客户端不应该依赖不需要的接口。 5、迪米特法则 又叫最少知道原则,一个类对其所依赖的类知道得越少越好。 6、里氏替换原则 子类可以扩展父...
原文链接:https://www.cnblogs.com/xiaofengwang/p/11255678.html 单例模式 简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。...
1.单例模式 作用:保证整个应用中某个实例 饿汉模式 懒汉模式 区别:饿汉模式在加载类时就会创建实例,所以加载类比较慢,但运行时获取对象较快,线程安全。懒汉模式则相反,加载类较快,获取对象时较慢,线程不安全。 拓展点:懒汉模式线程不安全点在于当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。这就引出了双重检验锁。 使用volatile修饰的原因:instance = ne...
什么是设计模式? 设计模式是可以重复利用的解决方案。软件开发的先辈们将在开发过程中遇到的问题进行总结,并给出解决方案。后辈在遇到类似问题时,可以使用这些方案解决问题。(从设计模式可以看出,先辈们对于接口的应用。) • 单例模式(ps:参考https://www.cnblogs.com/xiaofengwang/p/11255678.html) 一个类只有一个实例对象。这个对象的构造器被p...
简单工厂/静态工厂 单例模式 分为饿汉式,懒汉式 饿汉式 懒汉式 静态代理 抽象卖票方法 火车站卖票具体方法 中介 可对卖票方法进行增强 客户 另外 cjlib代理、jdk代理和静态代理很像 spring aop也是基于此实现的...
1. 写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。 2. 使用发布订阅模式写一个事件管理器,可以实现如下方式调用...
例题1:写一个Singleton出来。 答案:Singleton模式的主要作用是保证在java应用程序中,一个类Class只有一个实例存在。 Singleton模式通常有两种形式。 第一种形式:定义一个类,它的构造函数...