Java基础(五)设计模式——单例设计模式
程序员文章站
2022-07-14 08:49:51
...
-
设计模式:解决某一类问题最行之有效的方法。
Java中23中设计模式。
单例设计模式:解决一个类在内存中只存在一个对象的问题。(操作同一个对象)。想要保证对象唯一:
- 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类程序。
- 还为了让其他程序可以访问到该类对象, 只好在本类中自定义一个对象。
- 为了方便其他程序对自定义对象的访问,可以提供对外一些访问方式。
- 代码:饿汉式(开发中常用,不用考虑多线程等问题)
先初始化对象,Single类一进内存,就已经创建好了对象。
三个步骤:
public class Single {
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
public class Single {
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void show()
{
System.out.println("num = " + this.num);
}
}
class SingleDemo{
public static void main(String[] args) {
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
s1.setNum(30);
System.out.println("set s1.num:" + s1.getNum());
System.out.print("s1:");
s1.show();
System.out.print("s2:");
s2.show();
System.out.println("set s2.num:" + s2.getNum());
s2.setNum(2);
System.out.print("s1:");
s1.show();
System.out.print("s2:");
s2.show();
}
}
内存中只有一个对象。
-
代码:懒汉式
对象是 方法被调用时,才被初始化,也叫做对象的延时加载。
Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。代码如下:但是对于多线程不安全
public class Single {
private Single(){}
private static Single s = null;
public static Single getInstance()
{
if(s == null)
//————>A A线程进入
//————>B B线程进入
// 创建两个对象了。不是单例模式了
s = new Single();
return s;
}
}
解决方法一:加上锁(同步),效率变低了
public class Single {
private Single(){}
private static Single s = null;
public static synchronized Single getInstance()
{
if(s == null)
s = new Single();
return s;
}
}
解决方法二:提高了效率,但是代码复杂
public class Single {
private Single(){}
private static Single s = null;
public static Single getInstance()
{
if(s == null) //第一次判断
{
synchronized (Single.class) //加锁
{
if (s == null) //第二次判断
s = new Single();
}
}
return s;
}
}
总结:建议使用饿汉式,早建对象和晚建对象都要建。