单例模式模式的缺点,违反了单一职责原则。
应用场景,
(1)某类只要求生成一个对象的时候,如一国总统等。
(2)当对象需要被共享的场合。如 Web 中的配置对象、数据库的连接池,多线程的线程池等。
懒汉模式
该模式的特点是类加载时没有生成单例。
public LazySingleton{ //一. (1)public 对外提供的唯一成员,用于生成或获取实例。(2) 要在实例之前就存在,所以必须是static的。(3) synchronized 加同步实现串行化执行,保证多线程的安全性。 public static synchronized LazySingleton getInstance(){ if(lazySingleton==null){ LazySingleton lazySingleton = new LazySingleton() } return lazySingleton; } //二.(1)private避免类在外部直接访问。(2)只能通过getInstance实例化,因为getInstance是static,所以对象必须是static。(3)保证实例 在所有线程中同步 private static volatile LazySingleton lazySingleton = null; //三. private 避免类在外部被实例化 private lazySingleton(){} }
饿汉模式
该模式的特点是类一旦加载就创建一个单例。
饿汉模式 该模式的特点是类一旦加载就创建一个单例。 public HungrySingleton{ public static getInstance{ if(hungrySingleton==null){//有可能加载后又被销毁。 hungrySingleton = new HungrySingleton(); } return hungrySingleton; } //final 修饰成员变量必须要赋初始值,而且是只能初始化一次。 private static final HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton(){} } 饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题。
多例模式
public class Multiton{ private static List<Multiton> multitonList = new HashMap<>(); private static final int quantity = 3; private Multiton Multiton(){ } //static代码块是类定义的一部分,仅仅在类被虚拟机加载时候执行,而且只执行一次。 static { for(int i=0;i<quantity;i++){ multitonList.add(new Multiton()); } } public static Multiton getInstance(){ int value = (int) (Math.random()%quantity); return multitonList.get(i); } }