最容易的懂的设计模式之----单例模式

单例模式介绍与代码实现

一.什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。
在整个程序空间中,该类只存在一个实例对象。
其实,GOF对单例模式的定义是:保证一个类只有一个实例存在,同时提供能对实例加以访问对全局访问方法
二.为什么要使用单例模式
在应用系统开发中,
在多个线程之间,共享同一个资源或者操作同一个对象,
在整个程序空间使用全局变量,共享资源。
节省对象单创建时间。
因为在sigleton模式可以保证为一个类只生成一个唯一单实例对象,所以这些情况下单例模式可以派上用场。
代码实现一:

public class Person {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    }
    public class Main1 {
    public static void main(String[] args) {
        Person person1=Person.getPerson();//第一个对象
        Person person2=Person.getPerson();//第二个对象
        person1.setName("张三");
        person2.setName("李四");
        System.out.println(person1.getName());
        System.out.println(person2.getName());
        //结果是
        //张三
        //李四
        //通过get就知道是同一个对象。
    }
}

因为上述是通过构造方法来实例化对象。
假设把构造函数私有化。–就不能通过new来创建对象。

public class Person {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public static  Person getPerson(){
        return  new Person();
        }
    }
   public class Main1 {
    public static void main(String[] args) {
        Person person1=Person.getPerson();//第一个对象
        Person person2=Person.getPerson();//第二个对象
        person1.setName("张三");
        person2.setName("李四");
        System.out.println(person1.getName());
        System.out.println(person2.getName());
        //结果是
        //张三
        //李四
        //通过get就知道是同一个对象。
    }
}

发现还不是一个对象。
饿汉式:
public class Person {
private String name;
private static Person person=new Person();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Person getPerson(){
return person;
}
}这个是代码部分解析

懒汉式:
在这里插入图片描述

饿汉式和懒汉式比较
饿汉式,在类加载的时候只有一份,
懒汉式,在单线程是可以保证,
在多线程饿汉式可以保证,懒汉式不可以保证。

当第一个线程进来指向为空,实例化对象,在实例化的时候,第2个线程刚刚来,发现为空。然后就返回回去,相当于两个对象返回。
对懒汉式进行同步,因为多线程带来的问题。

多线程方式,加一个synchronized,相当于加锁,这样线程可以独占。这样确保线程处于临界区。
双重检查。
在这里插入图片描述
这样比同步方式还要效率好。这样先判断实例是否存在,不存在再加锁处理。不需要每个都进行判断。
当有两个线程,这样只有一个线程进入,另外一个在排队。其中一个出去,另外一个才能进去。

分享到此为止,希望大家对代码有问题或者想讨论的,可以联系我。qq:893564413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据学习爱好者

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值