今天,想和大家一起分享Java设计模式,希望该文作为我的学习总结,也希望本文能够给大家带来一点收获。
首先想和大家聊一聊:单列设计模式
讲解该问题,我想从三个问题来讲解:(1) 什么场景下使用该设计模式?(2) 怎么使用该设计模式?(3)使用案例。
什么场景下使用该设计模式?
要说清楚这个问题,我觉得还是应该先了解该设计模式的概念,单列设计模式,顾名思义,就是一个类有且仅有一个实例,并且自行实例化向整个系统提供,在《设计模式》这本书中这么定义了该设计模式,“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”。从这些概念我们大概知道了该设计模式,主要用于:需要一个类提供一个对象,该对象对所有的请求者都是相同的。这样比如对于多线程的问题,对不同的线程请求的对象都相同,对于全局固定对象,等情况,都可以采用单例模式进行对象的创建和请求。
怎么使用该设计模式?
那我们怎么进行单列模式的设计呢,首先我们还是从概念入手,分析出单例模式具有的三个要点;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。从实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,这样其它调用者不能再自行的创建该对象;二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。以上单列模式设计思想演变为两大主要的具体实现,1是懒汉式;2是恶汉式;具体的概念我就不多说了,主要说一下他俩的区分,主要是对象的创建是否在调用的时候才创建,懒汉,大家应该很清楚,懒,说明他不主动,因此该方式是在调用的时候才创建,恶汉式,则是很主动的,不需要外界的调用就为你准备好了这个对象。
这里还是具体写点这两种方式的代码吧!
(1) 懒汉式单列模式
public class Singleton {
private Singleton(){}; //私有化构造函数
private static Singleton singleton=null; //定义一个私有化的静态对象,
public static Singleton getInstance(){
//如果未创建该类,则进行创建,因此,只有第一次访问的时候才进行创建
if (singleton==null) {
singleton=new Singleton();
}
return singleton;
}
}
但是以上的实现代码并没有考虑多线程的情况,在并发环境下,可能会出现多个对象;为了保证线程的安全,我们可以在getInstance()方法上加上同步
public class Singleton {
private Singleton(){};
private static Singleton singleton=null;
public static synchronized Singleton getInstance(){
if (singleton==null) {
singleton=new Singleton();
}
return singleton;
}
}
这样就实现了线程安全。但是性能较低,可以通过静态内部类的方式加以解决
public class Singleton {
private Singleton(){};
private static class lazyHolder{
private static final Singleton INSTANCE= new Singleton();
}
public static final Singleton getInstance(){
return lazyHolder.INSTANCE;
}
}
(2) 恶汉式单列模式
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有化构造函数
private Singleton1() {}
//创建实例化对象
private static final Singleton1 single = new Singleton1();
//静态工厂方法 ,向外暴露对象的获取方法
public static Singleton1 getInstance() {
return single;
}
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。在多线程的编程中,我们一般使用恶汉式。
案例!
今天就这么多,下一次我想和大家分享模板方法!
设计模式-----模板方法