单例(懒汉式、饿汉式)、多例设计模式

1、单例、多例设计模式主要是一种控制实例化对象产生个数的设计模式。

2、在很多情况下是不需要重复产生对象的,所以就需要使用单例设计模式,即无论谁调用,仅产生一次实例化对象。

对单例设计模式分为两种:懒汉式和饿汉式

懒汉式:在第一次使用的时候进行实例化对象处理。

饿汉式:在系统加载类的时候就会自动提供有类实例化对象(一加载类就会立即创建对象)。

3、饿汉式写法

class Singleton {
    private static final Singleton INSTANCE = new Singleton() ;
    //将构造方法私有化,此时在主类中无法实例化该类对象
    private Singleton() {} 
    //因为保存对象的变量被封装外界不能访问到,所以应该提供一个公开的get方法,共外界使用。
    //因为外界在调用这个方法获取对象之前没有对象,不能通过对象调用方法,所以此方法应该用static修饰
    public static Singleton getInstance() {        
        return INSTANCE;
    }

    public void print() {
        System.out.print("一只瓶子a");
    }
}
public class DanLi {
    public static void main(String[] args) {
        Singleton instance = null ; //声明对象
        instance = Singleton.getInstance() ;
        instance.print();
    }
}

在类加载的时候就会创建对象,且类只会加载一次,所以这种写法可以保证对象的唯一性。弊端在于,因为类加载的时候就会创建对象,所以有时候还不需要使用对象时就会创建对象,造成内存的浪费。

4、懒汉式写法

//将构造方法私有化,此时在主类中无法实例化该类对象
    private Singleton() {} 
    // 在本类中创建唯一实例对象
    private static Singleton INSTANCE = null ;

  //对外提供一个公开静态的获取方法
    public static Singleton getInstance() {        
        if(INSTANCE == null) {
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
    public void print() {
        System.out.print("一只瓶子a");
    }

懒汉式单例设计模式在类加载的时候不创建对象,只有第一次调用函数时才创建对象,这样就可以避免出现内存浪费的问题。弊端在于:在多线程环境下不能保证对象的唯一性

5、多例设计模式——可以保留多个实例化对象

一般指有上限的多例模式(没上限的和new一个对象没有区别)。

package com.demo;
//多例设计模式 定义描述颜色的类
class Color {
    private static final Color RED = new Color("红色") ;    
    private static final Color GREEN = new Color("绿色") ;    
    private static final Color BLUE = new Color("蓝色") ;    
    private String title ;
    private Color(String title) {
        this.title = title ;
    }
    public static Color getInstance(String color) {
        switch(color) {
        case "red":
            return RED ;
        case "green":
            return GREEN ;
        case "blue":
            return BLUE ;
        default :
            return null ;
        }

    }
    public String toString() {
        return this.title;
    }
}
public class DuoLi {
    public static void main(String[] args) {
        Color c = Color.getInstance("red");
        System.out.println(c.toString()) ;
    }
}
单例与多例设计模式本质上是相同的,一定都会在内部提供有static方法以返回实例化对象。

你可能感兴趣的:(面向对象编程)