欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础(五)设计模式——单例设计模式

程序员文章站 2022-07-14 08:49:51
...

  1. 设计模式:解决某一类问题最行之有效的方法。

    Java中23中设计模式。
    单例设计模式:解决一个类在内存中只存在一个对象的问题。(操作同一个对象)。

    想要保证对象唯一:

    1. 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类程序。
    2. 还为了让其他程序可以访问到该类对象, 只好在本类中自定义一个对象。
    3. 为了方便其他程序对自定义对象的访问,可以提供对外一些访问方式。

  1. 代码:饿汉式(开发中常用,不用考虑多线程等问题)
    先初始化对象,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();
    }
}

内存中只有一个对象。


  1. 代码:懒汉式
    对象是 方法被调用时,才被初始化,也叫做对象的延时加载。
    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;
    }
}

总结:建议使用饿汉式,早建对象和晚建对象都要建。

相关标签: Java 设计模式