首页 > 编程知识 正文

单例模式java实现总结,java单例模式详解

时间:2023-12-28 21:10:44 阅读:328521 作者:ECXH

本文目录一览:

java怎么实现单实例运行

Java实现单例的5种方式

1. 什么是单例模式

单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。

2. 单例模式和静态类的区别

首先理解一下什么是静态类,静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。

知道了什么是静态类后,来说一下他们两者之间的区别:

1)首先单例模式会提供给你一个全局唯一的对象,静态类只是提供给你很多静态方法,这些方法不用创建对象,通过类就可以直接调用;

2)单例模式的灵活性更高,方法可以被override,因为静态类都是静态方法,所以不能被override;

3)如果是一个非常重的对象,单例模式可以懒加载,静态类就无法做到;

那么时候时候应该用静态类,什么时候应该用单例模式呢?首先如果你只是想使用一些工具方法,那么最好用静态类,静态类比单例类更快,因为静态的绑定是在编译期进行的。如果你要维护状态信息,或者访问资源时,应该选用单例模式。还可以这样说,当你需要面向对象的能力时(比如继承、多态)时,选用单例类,当你仅仅是提供一些方法时选用静态类。

如何在Java中实现单例模式?

单例模式1:

public

class

singleton{

private

static

singleton

st

=

null;

private

singleton(){

}

public

static

singleton

getinstance(){

if(st

==

null){

st

=

new

singleton();

}

return

st;

}

}

单例模式2:

public

class

singleton{

private

static

singleton

st

=

new

singleton();

private

singleton(){

}

public

static

singleton

getinstance(){

return

st;

}

}

多线程1:

导入thread所在的包

public

class

mythread1

extends

thread{

public

void

run(){

xxxxx写自己的代码

}

}

多线程2

导入runnable所在的包

public

class

mythread2

implements

runnable{

public

void

run(){

xxxxx写自己的代码

}

}

另写一个测试类,在main方法中这样写:

thread

t

=

new

mythread1();

或者

runnable

r

=

new

mythread2();

thread

t

=

new

thread(r);

JAVA单例模式的几种实现方法

JAVA

单例模式的几种实现方法

1.饿汉式单例类

package

pattern.singleton;

//

饿汉式单例类

.

在类初始化时,已经自行实例化

public

class

Singleton1

{

//

私有的默认构造子

private

Singleton1()

{}

//

已经自行实例化

private

static

final

Singleton1

single

=

new

Singleton1();

//

静态工厂方法

public

static

Singleton1

getInstance()

{

return

single;

}

}

2.

懒汉式单例类

package

pattern.singleton;

//

懒汉式单例类

.

在第一次调用的时候实例化

public

class

Singleton2

{

//

私有的默认构造子

private

Singleton2()

{}

//

注意,这里没有

final

private

static

Singleton2

single;

//

只实例化一次

static

{

single

=

new

Singleton2();

}

//

静态工厂方法

public

synchronized

static

Singleton2

getInstance()

{

if

(single

==

null

)

{

single

=

new

Singleton2();

}

return

single;

}

}

在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里建议使用所谓的

"

双重检查成例

".

必须指出的是,

"

双重检查成例

"

不可以在

Java

语言中使用。不十分熟悉的读者,可以看看后面给出的小节。

样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉

式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,

比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处

理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源

初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。

饿汉式单例类可以在

Java

语言内实现,

但不易在

C++

内实现,因为静态初始化在

C++

里没有固定的顺序,因而静态的

m_instance

变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么

GoF

在提出单例类的概念时,举的例子是懒

汉式的。他们的书影响之大,以致

Java

语言中单例类的例子也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合

Java

言本身的特点。

3.

登记式单例类

.

package

pattern.singleton;

import

java.util.HashMap;

import

java.util.Map;

//

登记式单例类

.

//

类似

Spring

里面的方法,将类名注册,下次从里面直接获取。

public

class

Singleton3

{

private

static

MapString,Singleton3

map

=

new

HashMapString,Singleton3();

static

{

Singleton3

single

=

new

Singleton3();

map.put(single.getClass().getName(),

single);

}

//

保护的默认构造子

protected

Singleton3(){}

//

静态工厂方法

,

返还此类惟一的实例

public

static

Singleton3

getInstance(String

name)

{

if

(name

==

null

)

{

name

=

Singleton3.

class

.getName();

System.out.println("name

==

null"+"---name="+name);

}

if

(map.get(name)

==

null

)

{

try

{

map.put(name,

(Singleton3)

Class.forName(name).newInstance());

}

catch

(InstantiationException

e)

{

e.printStackTrace();

}

catch

(IllegalAccessException

e)

{

e.printStackTrace();

}

catch

(ClassNotFoundException

e)

{

e.printStackTrace();

}

}

return

map.get(name);

}

//

一个示意性的商业方法

public

String

about()

{

return

"Hello,

I

am

RegSingleton.";

}

public

static

void

main(String[]

args)

{

Singleton3

single3

=

Singleton3.getInstance(

null

);

System.out.println(single3.about());

}

}

如何用Java实现单例模式

单例模式:就是一个类仅创建一个对象;pre t="code" l="java"public class Singleton {

private static volatile Singleton singleton = null;

private Singleton(){}// 构造方法

public static Singleton getSingleton(){// 单例模式

if(singleton == null){

synchronized (Singleton.class){

if(singleton == null){

singleton = new Singleton();

}

}

}

return singleton;

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。