导航:首页 > 编程语言 > java代码是单例

java代码是单例

发布时间:2022-08-15 19:10:30

java 单例模式

单例模式中,构造方法被私有化了,所以你不能new,只能调用它提供给你的getInstance方法来获取对象,这样就保证了,该对象只会被new一次,你拿到的永远都是第一次被new出来的那个对象
Emperor getInstance 中,Emperor是返回的类型,getInstance才是方法名,并不是像你说的两个单词的方法名,至于static是用来修饰方法,表示这个方法是类方法,可以直接用类名调用。

❷ java 单例模式这个要怎么理解

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
介绍

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用实例:
1、一个班级只有一个班主任。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
1、要求生产唯一序列号。
2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

❸ java的单例模式怎么能保证始终是单例

第一种:饱汉模式
public class SingleTon {
private SingleTon(){
}
//实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间
private final static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}

第二种:饥汉模式
public class SingleTon {
private SingleTon(){}
private static instance = null; //newSingleTon();

public static synchronized SingleTon getInstance(){
if(instance == null)
instance = new SingleTon();
return instance;
}
}

第三种:用枚举
public enum SingleTon{
ONE;
}

第三:更实际的应用(在什么情况用单例)
public classSequenceGenerator{
//下面是该类自身的业务功能代码
private int count = 0;
public synchronized int getSequence(){
++count;
}
//下面是把该类变成单例的代码
private SequenceGenerator(){}
private final static instance = new SequenceGenerator();
public static SingleTon getInstance(){
return instance;
}
}

第四:
public class MemoryDao {
privateHashMap map = new HashMap();
publicvoid add(Student stu1){
map.put(SequenceGenerator.getInstance().getSequence(),stu1);
}
//把MemoryDao变成单例
}

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private staticSingleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public staticSingleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些

❹ java 这个代码属于单例设计模式吗

应该算是单例,单例的优点就是只new一次,程序启动时候初始化一次!

❺ Java单例模式怎么用

java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
例: 在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源管理器常常设计成单例模式。
外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。

一个例子:Windows 回收站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。

两种形式:
1,饿汉式单例类
public class Singleton {

private Singleton(){}

//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用

private static Singleton instance = new Singleton();

//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}

❻ java 单例模式怎么写

概念:
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。首先看一个经典的单例实现。public class Singleton { private static Singleton uniqueInstance = null; private Singleton() { // Exists only to defeat instantiation. } public static Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } // Other methods...}Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。 1publicclass TestStream {
2private String name;
3public String getName() {
4return name;
5 }
6publicvoid setName(String name) {
7this.name = name;
8 }
9//该类只能有一个实例
10private TestStream(){} //私有无参构造方法
11//该类必须自行创建
12//有2种方式
13/*private static final TestStream ts=new TestStream();*/
14privatestatic TestStream ts1=null;
15//这个类必须自动向整个系统提供这个实例对象
16publicstatic TestStream getTest(){
17if(ts1==null){
18 ts1=new TestStream();
19 }
20return ts1;
21 }
22publicvoid getInfo(){
23 System.out.println("output message "+name);
24 }
25 } 1publicclass TestMain {
2publicstaticvoid main(String [] args){
3 TestStream s=TestStream.getTest();
4 s.setName("张孝祥");
5 System.out.println(s.getName());
6 TestStream s1=TestStream.getTest();
7 s1.setName("张孝祥");
8 System.out.println(s1.getName());
9 s.getInfo();
10 s1.getInfo();
11if(s==s1){
12 System.out.println("创建的是同一个实例");
13 }elseif(s!=s1){
14 System.out.println("创建的不是同一个实例");
15 }else{
16 System.out.println("application error");
17 }
18 }
19 }运行结果:
张孝祥
张孝祥
output message 张孝祥
output message 张孝祥
创建的是同一个实例结论:由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。1.饿汉式单例类 1//饿汉式单例类.在类初始化时,已经自行实例化
2publicclass Singleton1 {
3//私有的默认构造子
4private Singleton1() {}
5//已经自行实例化
6privatestaticfinal Singleton1 single = new Singleton1();
7//静态工厂方法
8publicstatic Singleton1 getInstance() {
9return single;
10 }
11 }2.懒汉式单例类 1//懒汉式单例类.在第一次调用的时候实例化
2publicclass Singleton2 {
3//私有的默认构造子
4private Singleton2() {}
5//注意,这里没有final
6privatestatic Singleton2 single=null;
7//静态工厂方法
8publicsynchronizedstatic Singleton2 getInstance() {
9if (single == null) {
10 single = new Singleton2();
11 }
12return single;
13 }
14 }3.登记式单例类
1import java.util.HashMap;
2import java.util.Map;
3//登记式单例类.
4//类似Spring里面的方法,将类名注册,下次从里面直接获取。
5publicclass Singleton3 {
6privatestatic Map<String,Singleton3> map = new HashMap<String,Singleton3>();
7static{
8 Singleton3 single = new Singleton3();
9 map.put(single.getClass().getName(), single);
10 }
11//保护的默认构造子
12protected Singleton3(){}
13//静态工厂方法,返还此类惟一的实例
14publicstatic Singleton3 getInstance(String name) {
15if(name == null) {
16 name = Singleton3.class.getName();
17 System.out.println("name == null"+"--->name="+name);
18 }
19if(map.get(name) == null) {
20try {
21 map.put(name, (Singleton3) Class.forName(name).newInstance());
22 } catch (InstantiationException e) {
23 e.printStackTrace();
24 } catch (IllegalAccessException e) {
25 e.printStackTrace();
26 } catch (ClassNotFoundException e) {
27 e.printStackTrace();
28 }
29 }
30return map.get(name);
31 }
32//一个示意性的商业方法
33public String about() {
34return "Hello, I am RegSingleton.";
35 }
36publicstaticvoid main(String[] args) {
37 Singleton3 single3 = Singleton3.getInstance(null);
38 System.out.println(single3.about());
39 }
40 }

❼ java中的单例模式的代码怎么写

单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例。
可分为eager模式,示例代码如下:
Java代码
1.class EagerSingleton{
2. private static final EagerSingleton m_instance = new EagerSingleton();
3. private EagerSingleton(){}
4. public static EagerSingleton getInstance(){
5. return m_instance;
6. }
7.}
class EagerSingleton{
private static final EagerSingleton m_instance = new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getInstance(){
return m_instance;
}
}
和 lazy模式,示例代码如下:
Java代码
1.class LazySingleton{
2. private static LazySingleton m_instance = null;
3. private LazySingleton(){}
4. public synchronized static getInstance(){
5. if(m_instance == null){
6. m_instance = new LazySingleton();
7. }
8. return m_instance;
9. }
10.}
class LazySingleton{
private static LazySingleton m_instance = null;
private LazySingleton(){}
public synchronized static getInstance(){
if(m_instance == null){
m_instance = new LazySingleton();
}
return m_instance;
}
}
java源码中,Runtime.getRuntime()就是单例的一个例子。
单例模式的精神就是整个系统中维护一个实例,推广开来,如果在一个系统中需要维护多个示例,那么就产生了多例模式(multiton)。
多例模式(Multiton) ,通过聚集对象了保留自身的多个示例,根据客户端的参数返回所需要的实例。
示例代码如下:
Java代码
1.class Multiton{
2. private final int INSTANCE_SIZE = 10;
3. private static Map instances = new HashMap(INSTANCE_SIZE);
4. private String name;
5. private Multiton(){}
6. private Multiton(String name){
7. this.name = name;
8. }
9. public synchronized static getInstance(String name){
10. if(instances.containsKey(name)){
11. return instances.get(name);
12. }
13. else{
14. ins = new Multiton(name);
15. instances.put(name, ins);
16. return ins;
17. }
18. }
19.}
class Multiton{
private final int INSTANCE_SIZE = 10;
private static Map instances = new HashMap(INSTANCE_SIZE);
private String name;
private Multiton(){}
private Multiton(String name){
this.name = name;
}
public synchronized static getInstance(String name){
if(instances.containsKey(name)){
return instances.get(name);
}
else{
ins = new Multiton(name);
instances.put(name, ins);
return ins;
}
}
}
[nextpage]
一个实用的例子就是KeyGenerator, 示例代码如下:
Java代码
1.class KeyGenerator{
2. private final int POOL_SIZE = 20;
3. private static Map instances = new HashMap(16);
4. private KeyInfo keyinfo;
5. private KeyGenerator(){}
6. private KeyGenerator(String keyName){
7. this.keyinfo = new KeyInfo(POOL_SIZE, keyName);
8. }
9. public synchronized static getInstance(String keyName){
10. if(instances.containsKey(keyName)){
11. return (KeyGenerator)instances.get(keyName);
12. }
13. else{
14. keyGen = new KeyGenerator(keyName);
15. instances.put(name, keyGen);
16. return keyGen;
17. }
18. }
19. public synzhronized int getNextKey(){
20. return keyinfo.getNextKey();
21. }
22. }
class KeyGenerator{
private final int POOL_SIZE = 20;
private static Map instances = new HashMap(16);
private KeyInfo keyinfo;
private KeyGenerator(){}
private KeyGenerator(String keyName){
this.keyinfo = new KeyInfo(POOL_SIZE, keyName);
}
public synchronized static getInstance(String keyName){
if(instances.containsKey(keyName)){
return (KeyGenerator)instances.get(keyName);
}
else{
keyGen = new KeyGenerator(keyName);
instances.put(name, keyGen);
return keyGen;
}
}
public synzhronized int getNextKey(){
return keyinfo.getNextKey();
}
}

阅读全文

与java代码是单例相关的资料

热点内容
java笔试编程题 浏览:741
win11什么时候可以装安卓 浏览:560
java不写this 浏览:999
云点播电影网php源码 浏览:95
pythonclass使用方法 浏览:224
移动加密软件去哪下载 浏览:294
php弹出alert 浏览:209
吉林文档课件加密费用 浏览:136
传感器pdf下载 浏览:289
随车拍app绑定什么设备 浏览:898
方维团购系统源码 浏览:993
linux反弹shell 浏览:159
打印机接口加密狗还能用吗 浏览:301
二板股票源码 浏览:448
度人经pdf 浏览:902
怎么配置android远程服务器地址 浏览:960
java程序员看哪些书 浏览:943
什么app可以免费和外国人聊天 浏览:797
pdf手写笔 浏览:182
别永远伤在童年pdf 浏览:990