问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA的单例模式到底有几种变现形式?请列举?

发布网友 发布时间:2022-05-18 20:53

我来回答

2个回答

热心网友 时间:2023-11-02 13:05

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 Map<String,Singleton3> map = new HashMap<String,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());
}
}

热心网友 时间:2023-11-02 13:06

2种
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}

public class Singleton {
private static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}追问这两种有区别吗??

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
深圳公共营养师怎么申请补贴 深圳公共营养师补贴怎么领 深圳营养师工资待遇怎么样 ...出道16年一直不露额头,当他撩起刘海,效果堪比「 ”整容”_百度... ...刘海的鹿晗,重回颜值巅峰!换个发型堪比“整容”都有哪些?_百度... ...整容”叫尹正剪头,仅仅换个发型而已,为何会变化那么大呢?_百度... 会计考高级有什么要求 报考高级会计需要什么条件呢? 工程项目融资、建设、管理、运营等过程中各模式的英文简称及专业分析... 200平米别墅装修多少钱别墅装修需要注意些什么 不用手机号码也不用qq号号怎么注册 手机没有手机卡怎么申请? NIKE鞋穿42.5 PUMA穿多大的? A卡和N卡是怎么对应的? 今年什么时候取消手机长途费和长途漫游费 固定电话是否取消长途费? 联通手机长途话费取消了吗? 这幅油画原图完整版叫什么名字!!太美丽了 图自以前的lens 可是找不到原图了 这是我拍的贴纸 寻求红豆 (王菲)播放地址? 怎么下载小红书? c语言中,怎么编写水仙花素的程序? 2016年底河北省张家口赤城县还有什么公务员考试吗 2014年张家口事业单位考试的题型都有什么呢?我是考公共科目,行测和公务员的差不多吧,这个有写作吗? 打印出所有水仙花数,所谓水仙花数是指一个三位数,起各位数字立方和等于该数。。用c语言 河北省公*中的张家口户籍(或生源地)和张家口市辖区户籍(或生源地)的区别? 河北省公*我报的是张家口的职位,是在张家口考试还是石家庄考试? 张家口学院考公率是多少 2020河北张家口公务员考试监狱历年分数线是多少? 河北省张家口公务员考试都考什么科目? 在张家口复合什么条件就可以报考公务员了 高效Java技巧之如何正确的实现单例 传奇怎么用连击 传奇的传送戒指怎么用? 传奇私服怎么使用合击 热血传奇技能怎么使用? 传奇英雄怎么用? 热血传奇连击技怎么用 有什么好玩的枪战类的电脑游戏!不要跟我说AVA,CF,CS这些废话! 亮黄色卫衣里面陪白色翻领T桖好看不 中矣的中指什么意思? 日本百乐钢笔长宁区那里有买 子曰:温故而知新,可以为师矣。中矣的意思 古人谈读书中的矣是什么意思? 是亦教诲之而已矣中矣的意思? 百乐bllh-20c4在日本卖多少钱呢?我这里13元一只贵吗? 虽与之俱,学弗若之矣中,矣的意思 列子学剑的文言文中,于的意思 昔我往矣中的矣是什么意思 led灯关闭开关后还亮 吉利博瑞ge机舱保险盒哪个是acc