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

28 篇文章 5 订阅

  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;
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值