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方法以返回实例化对象。