zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java学习路线-9:多例设计与枚举类

JAVA学习 设计 枚举 路线
2023-09-14 09:07:12 时间

第25 章 : 单例设计模式

110 单例设计

单例设计模式:只允许提供一个实例对象
- 饿汉式:系统加载就实例化
- 懒汉式:第一次使用的时候实例化
多例设计模式

单例模式特点:
构造方法私有化,内部提供static方法获取实例化对象

饿汉式单例模式

class Singleton{
    private static Singleton singleton = new  Singleton();
    
    // 构造函数私有化
    private Singleton(){};

    public static Singleton getInstance(){
        return singleton ;
    }
}

class Demo{
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
    }
}

懒汉式单例模式

class Singleton{
    private static Singleton singleton ;
    
    // 构造函数私有化
    private Singleton(){};

    public static Singleton getInstance(){
        // 第一次使用实例化
        if (singleton == null){
           singleton = new  Singleton();
        }
        return singleton ;
    }
}

111 多例设计

class Color{
    private String title;

    private static final Color RED = new Color("红色");
    private static final Color GREEN = new Color("绿色");
    private static final Color BLUE = new Color("蓝色");

    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;
        }
    }

    @Override
    public String toString(){
        return this.title;
    }
}

class Demo{
    public static void main(String[] args) {
        Color red = Color.getInstance("red") ;
        System.out.println(red);
    }
}

单例和多例都会提供一个静态获取实例化的方法

第26 章 : 枚举

112 定义枚举类

JDK >= 1.5
枚举主要用于定义有限个数对象的一种结构(多例设计)

枚举可以在程序编译时判断实例化对象是否存在

enum Color{
    RED,
    GREEN,
    BLUE
}

class Demo{
    public static void main(String[] args) {
        for(Color color : Color.values()){
            System.out.println(color);
        }
        // RED GREEN BLUE
    }
}

switch中对枚举类判断

enum Color{
    RED,
    GREEN,
    BLUE
}

class Demo{
    public static void main(String[] args) {
        Color color = Color.RED ;
        
        switch(color){
            case RED :
                System.out.println("红色");
                break;

            case GREEN :
                System.out.println("绿色");
                break;

            case BLUE :
                System.out.println("蓝色");
                break;

            default :
                System.out.println("default");
        }
        // 红色
    }
}

113 Enum类

枚举本质是一个类

枚举中每一个对象序号都是根据枚举对象的定义顺序来决定的

enum Color{
    RED,
    GREEN,
    BLUE
}

class Demo{
    public static void main(String[] args) {
        for(Color color : Color.values()){
            System.out.println(color.ordinal() + " - " + color.name());
        }
        /**
        0 - RED
        1 - GREEN
        2 - BLUE
        */
    }
}

enum和Enum区别
enum 是JDK 1.5之后提供的关键字,定义枚举类
Enum 是一个抽象类,关键字enum定义的类默认继承此类

114 定义枚举结构

枚举类本身属于多例设计模式

在枚举类中定义其他结构

// 枚举类
enum Color{

    // 枚举对象要写在首行
    RED("红色"), GREEN("绿色"), BLUE("蓝色") ;


    // 定义属性
    private String title ;

    private Color(String  title){
        this.title = title ;
    }

    @Override
    public String toString(){
        return this.title ;
    }
}

class Demo{
    public static void main(String[] args) {
        for(Color color : Color.values()){
            System.out.println(color.ordinal() + " - " + color.name() + " - " + color);
        }
        /**
       0 - RED - 红色
        1 - GREEN - 绿色
        2 - BLUE - 蓝色
        */
    }
}

枚举类中可以实现接口继承

interface Imessage{
    public String getMessage();
}

enum Color implements Imessage{
    RED("红色"), GREEN("绿色"), BLUE("蓝色") ;

    private String title ;

    private Color(String  title){
        this.title = title ;
    }

    @Override
    public String toString(){
        return this.title ;
    }

    public String getMessage(){
        return this.title ;
    }
}

class Demo{
    public static void main(String[] args) {
        Imessage message = Color.RED ;
        System.out.println(message.getMessage());
        // 红色
    }
}

枚举类可以直接定义抽象方法,
并且要求每一个枚举对象都要独立覆写此抽象方法


enum Color{
    RED("红色"){
        public String getMessage(){
            return this.toString();
        }
    }, 

    GREEN("绿色"){
        public String getMessage(){
            return this.toString();
        }
    }, 

    BLUE("蓝色"){
        public String getMessage(){
            return this.toString();
        }
    } ;

    private String title ;

    private Color(String  title){
        this.title = title ;
    }

    @Override
    public String toString(){
        return this.title ;
    }

    public abstract String getMessage() ;
        
}

class Demo{
    public static void main(String[] args) {        
        System.out.println(Color.RED.getMessage());
        // 红色

    }
}

枚举类不建议写太多内容

115 枚举应用案例

enum Sex{
    MAN("男"), FEMALE("女") ;

    private String title;

    private Sex(String title){
        this.title = title ;
    }

    @Override
    public String toString(){
        return this.title ;
    }
}

class Person{
    private String name ;
    private int age ;
    private Sex sex ;

    public Person(String name, int age, Sex sex){
        this.name = name ;
        this.age = age ;
        this.sex = sex ;
    }

    @Override
    public String toString(){
        return "Person(" + this.name + " " + this.age + " " + this.sex + ")";
    }
}


class Demo{
    public static void main(String[] args) {
        Person person = new Person("张三", 23, Sex.MAN);
        System.out.println(person);
        // Person(张三 23 男)
    }
}