设计模式之单例模式

什么是单例模式?
单例模式就是一个类只能创建一个对象;

特点:

既然只能创建一个对象那么就在类外不能随意创建对象,所以就将构造方法私有化,在类内创建唯一的对象;

构造方法私有化后,只能在类内创建对象,所以在类内封装这个类的对象作为属性

因为对象是在类内创建的,所以就需要提供一个外部类获取这个对象的方法,我们都知道,调用一个类的普通方法需要对象才能调用,而我们现在才是获取对象,所以要将这个方法进行static修饰,直接用类名来调用;

得到对象的方法被static修饰后,不能直接访问类中的非static属性,其二:普通的对象都是在产生实例化对象的时候才能进行内存分配,而现在外部类无法产生对象,想要在对象还没有产生的时候能进行使用,所以需要将属性用static修饰

一般来说我们希望这个类中只有一个实例化对象,一般还将属性进行final修饰;

现在举一个饿汉式的单例模式:

class Singleton {
private final static  Singleton SINGLETON = new Singleton();
private  Singleton(){
}
public static Singleton getsingleton(){
    return SINGLETON;
}
public  void  print() {
    System.out.println("Hello World");
}
}
public class TextSingleton {
public static void main(String[] args) {
    Singleton singleton = Singleton.getsingleton();
    Singleton singleton2 = Singleton.getsingleton();
    Singleton singleton3= Singleton.getsingleton();
    System.out.println(singleton);
    System.out.println(singleton2);
    System.out.println(singleton3);
    singleton.print();
}
}

结果:
在这里插入图片描述
三个对象的地址是一样的,说明就是只产生了一个对象。

单例模式还有一种懒汉式:
饿汉式单例模式是直接new对象,而懒汉式是在需要的时候在new一个对象出来;

public class Singleton {
private  static  Singleton singleton= null;
private  Singleton(){
}
public static Singleton getsingleton(){
    if(singleton==null){
        singleton=new Singleton();
    }
    return singleton;
}
public  void  print() {
    System.out.println("Hello World");
}
}
public class TextSingleton {
public static void main(String[] args) {
    Singleton singleton = Singleton.getsingleton();
    Singleton singleton2 = Singleton.getsingleton();
    Singleton singleton3= Singleton.getsingleton();
    System.out.println(singleton);
    System.out.println(singleton2);
    System.out.println(singleton3);
    singleton.print();
}
 }

假设我现在有两个线程,一个执行到if语句,准备new对象,这时第二个线程进来得到singleton为null,这样就会产生两个对象,所以饿汉式单例模式在多线程时存在安全问题,而饿汉式单例模式不存在这样的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值