单例设计模式

Posted 谁有特马肉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例设计模式相关的知识,希望对你有一定的参考价值。

什么是设计模式

  1. 静态方法和属性的经典使用

  2. 设计模式是:在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决方法

什么是单例模式

  • 单个实例的设计模式

  • 所谓类的单例设计模式,就是采用一定的方法保证在整个的软件系统中,对某个类只能存在一个对象的实例,并且该类只提供一个取得其对象实例的方法

单例模式的分类:

  1. 饿汉式

  2. 懒汉式

饿汉式与懒汉式的区别

  1. 二者最大的区别是:创建时机不同:饿汉式在类加载的时候就创建了对象实例。而懒汉式是在使用时才存在

  2. 饿汉式不存在线程安全问题,懒汉式存在线程安全问题-----(当多个线程同时进入判断时)

  3. 饿汉式存在浪费资源的可能,因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了。懒汉式是使用时才创建,就不存在这个问题

  4. javaSE标准类中,java.lang.Runtime就是经典的单例模式

饿汉式

步骤实现:

  1. 构造器私有化

  2. 类的内部创建对象

  3. 向外暴露一个静态的公共方法。getInstance

代码实现:

/**
* 饿汉式
* 1. 构造器私有化-----防止在类的外部直接创建
* 2. 在类的内部创建对象(该对象是静态的)
* 3. 向外暴露一个静态的公共方法。getInstance
* 他为什么是饿汉式
* 因为:
*     当调用类的静态变量时,会导致类被加载,静态的对象会被执行。静态对象一执行,那么这个对象就会存在了
*/
public class SingleTon01 {
   public static void main(String[] args) {
       Cat instance = Cat.getInstance();
       System.out.println(instance);
       Cat instance1 = Cat.getInstance();
       System.out.println(instance1);
       //instance对象与instance1同一个对象
       System.out.println(instance==instance1);//true
  }
}
class  Cat{
   private String name;
   public static  int n1 = 100;
   //为了在静态方法中,返回其对象,需要将其修饰为静态方法
   //对象,通常为重量级的对象,饿汉式可以会造成创建了对象,但没有使用,会造成资源的浪费
   private static Cat cat = new Cat("小红");
   private Cat(String name) {
       this.name = name;
  }
   public static Cat getInstance(){

       return cat;
  }

   @Override
   public String toString() {
       return "Cat{" +
               "name=\'" + name + \'\\\'\' +
               \'}\';
  }
}

懒汉式

步骤:

  • 1.构造器私有化

  • 2.定义一个私有的静态属性对象

  • 3.提供一个public 的static方法---中间加判断

代码实现:

/**
* 懒汉式
*
*   当类被调用是,不会创建对象,需要自己调用,后面再次调用,会返回上次创建的对象,从而保证了单例
*/
public class SingleTon02 {
   public static void main(String[] args) {
       Dog instance = Dog.getInstance();
       System.out.println(instance);
       //第二次调用的时候,会得到上次创建的对象
       Dog instance1 = Dog.getInstance();
       System.out.println(instance1);
       System.out.println(instance==instance1);//true
  }
}
class Dog{
   private  String  name;
   private  static  Dog dog;
   private Dog(String name) {
       this.name = name;
  }
   public  static Dog getInstance(){
       if(dog == null){
           dog = new Dog("大黄");
      }
       return dog;
  }

   @Override
   public String toString() {
       return "Dog{" +
               "name=\'" + name + \'\\\'\' +
               \'}\';
  }
}

 

以上是关于单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

从 Viewpager2 片段访问父片段函数

你熟悉的设计模式都有哪些?写出单例模式的实现代码