Java-单例、多例设计模式

一、单例设计模式

Q:编写一个Singleton程序,并说明其主要特点。

A:Singleton即单例设计模式。


特点:

  1. 构造方法被私有化(private Singleton();),只能通过getInstance()方法取得Singleton类的实例化对象,并且最终只有一个实例化对象。
  2. 在单例设计模式中,一定会有一个static方法,用于取得本类的实例化对象。
package com.joeaaa.demo07;
/*
* 单例设计模式
*/
class Singleton { // 定义一个类
    private static final Singleton INSTANCE = new Singleton();
    private Singleton(){ } // 构造方法私有化
    public void print(){
        System.out.println("Hello,world!");
    }
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

public class singletonTest {
    public static void main(String[] args) {
        Singleton inst = null; // 声明对象
        inst = Singleton.getInstance(); // 实例化对象
        inst.print(); // 调用方法
    }
}

单例设计模式分为:饿汉式,懒汉式。

  1. 饿汉式:即上面的在类中INSTANCE定义属性时就直接进行实例化对象。
  2. 懒汉式:不主动进行实例化对象,在第一次使用一个类实例化对象的时候才去实例化。

懒汉式👇

package com.joeaaa.demo07;
/*
* 单例设计模式,懒汉式
*/
class Singleton { // 定义一个类
    private static Singleton instance;
    private Singleton(){ } // 构造方法私有化
    public void print(){
        System.out.println("Hello,world!");
    }
    public static Singleton getInstance(){
        if (instance == null){ // 如果没有实例化,
            instance = new Singleton(); // 才去实例化
        }
        return instance;
    }
}

二、多例设计模式

单例设计模式是只留一个类的一个实例化对象,多例设计模式会定义出多个对象。例如定义一个表示性别的类,只有两个取值。因此这样的类不能由用户无限制的去创建实例化对象,所以,不管是单例设计模式还是多例设计模式,构造方法都要私有化。

package com.joeaaa.demo07;

/*
* 多例设计模式:Multiton Pattern
*/
class Sex{
    private static final Sex MALE = new Sex("男");
    private static final Sex FAMALE = new Sex("女");
    private String title;
    private Sex(String title){ // 构造方法私有化
        this.title = title;
    }
    public static Sex getInstance(String msg){
        switch (msg){
            case "male":
                return MALE;
            case "famale":
                return FAMALE;
            default:
                return null;
        }
    }
    public String getTitle(){
        return this.title;
    }
}
public class multitonTest {
    public static void main(String[] args) {
        Sex male = Sex.getInstance("male");
        assert male != null;
        System.out.println(male.getTitle());
    }
}