单例模式、枚举、enum关键字的枚举

一、单例模式

1、什么是设计模式?

解决某个问题的,最优方式称作设计模式
拓展释义:设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。

2、单例模式释义?

  • 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
  • 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
  • 单例模式:编程中出现了一个问题-->如何让一个类在Java内存中只创建一个对象,即包含了静态优点,也避免了静态缺点。

静态随着类走,类随着Java虚拟机走,虚拟机停止时类销毁所有,放静态方法区需要谨慎点

2、单例模式注意点及优缺点

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。
  • 优点:节省静态方法区中的内存,使用时效率高。
  • 缺点:相对静态来讲,效率还是要低一些。

3、实现步骤

  • 私有化构造方法
  • 自己创建对象并记录住
  • 保证整个变量的安全

4.常见的三种单例模式

  • 懒汉式/饱汉式
//懒汉式   饱汉式 
public class MyTool {

    private static MyTool myTool = null;
    //私有话构造方法, 让使用者无法new对象
    //这样使用者就没有办法创建多个对象了
    private MyTool(){}
    //提供一个静态方法, 使用者调用这个方法可以获取对象
    //这样,我们就可以控制创建的对象了
    public static MyTool getInstance(){
        //第一次访问时,发现变量中没有记录对象, 就新建对象
        //如果已经创建过对象,就直接返回
        if(myTool==null){
            myTool = new MyTool();
        }
        
        return myTool; 
    }
    
}
  • 饿汉式1
//饿汉式
public class MyTool2 {

    private static MyTool2 myTool = new MyTool2();
    //私有话构造方法, 让使用者无法new对象
    //这样使用者就没有办法创建多个对象了
    private MyTool2(){}
    //提供一个静态方法, 使用者调用这个方法可以获取对象
    //这样,我们就可以控制创建的对象了
    public static MyTool2 getInstance(){
        
        return myTool; 
    }
    
}

  • 饿汉式2
//饿汉式
public class MyTool3 {

    public static final MyTool3 MY_TOOL = new MyTool3();
    //私有话构造方法, 让使用者无法new对象
    //这样使用者就没有办法创建多个对象了
    private MyTool3(){}

    

}

二、枚举

1、定义

  • 枚举是一个概念即列举的意思,将所有的i情况都列举出来,那么取值的十号只能是这几种情况的一种,不可能是别的
  • 在Java中枚举可以理解为有限制的多例,在当前类中定义多个实例供别人使用。
  • 枚举多用于将一组信息装载到一个对象中

2、应用场景举例

  • 一个星期只有七天,我们可以把这些字符串装在一个数组或者集合中去供我们使用(这也是枚举),但是扩展性非常差,比如我们想显示英文就必须重写一次。使用枚举类来实现,就是将变量放到一个类中,然后有限制的定义几个对象使用。

3、格式

  • 空参构造的枚举类(没有意义)
public  class Week {
    
    public static final Week MON = new Week();
    public static final Week TUE = new Week();
    public static final Week WED = new Week();
    public static final Week THU = new Week();
    public static final Week FRI = new Week();
    public static final Week SAT = new Week();
    public static final Week SUN = new Week();
}
  • 有参构造的枚举类
public  class Week {
    
    public static final Week MON = new Week("星期一");
    public static final Week TUE = new Week("星期二");
    public static final Week WED = new Week("星期三");
    public static final Week THU = new Week("星期四");
    public static final Week FRI = new Week("星期五");
    public static final Week SAT = new Week("星期六");
    public static final Week SUN = new Week("星期日");
    private String name;
    //私有化构造
    private Week(String name){
        this.name = name;
    }
    //提供getter方法,便于别人使用
    public String getName() {
        return name;
    }

}
  • 有方法的枚举类
public  class Week {
    
    public static final Week MON = new Week("星期一");
    public static final Week TUE = new Week("星期二");
    public static final Week WED = new Week("星期三");
    public static final Week THU = new Week("星期四");
    public static final Week FRI = new Week("星期五");
    public static final Week SAT = new Week("星期六");
    public static final Week SUN = new Week("星期日");
    public String name;
    //私有化构造
    private Week(String name){
        this.name = name;
    }
    //提供getter方法,便于别人使用
    public String getName() {
        return name;
    }
    //提供特殊方法
    public  void show(){
        System.out.println("今天是"+name);
    }
}
  • 包含抽象方法的枚举类
public abstract class Week {
    
    private static final Week MON = new Week("星期一"){
        public  void show(){
            System.out.println("星期一好难受");
        }
        
    };
    private static final Week TUE = new Week("星期二"){
        public  void show(){
            System.out.println("星期二晕晕乎乎");
        }
        
    };
    private static final Week WED = new Week("星期三"){
        public  void show(){
            System.out.println("咦,星期三了...");
        }
        
    };
    private static final Week THU = new Week("星期四"){
        public  void show(){
            System.out.println("赶紧,赶紧,今天快点结束");
        }
        
    };
    private static final Week FRI = new Week("星期五"){
        public  void show(){
            System.out.println("哇,好棒,星期五了");
        }
        
    };
    private static final Week SAT = new Week("星期六"){
        public  void show(){
            System.out.println("睡的真舒服");
        }
        
    };
    private static final Week SUN = new Week("星期日"){
        public  void show(){
            System.out.println("好开心哦, 时间慢慢走哈");
        }
        
    };
    private String name;
    //私有化构造
    private Week(String name){
        this.name = name;
    }
    //提供getter方法,便于别人使用
    public String getName() {
        return name;
    }
    
    public abstract void show();
}

三、enum关键字的枚举

  • 1、定义
  • jdk1.5推出了enum关键字来帮我们简化格式。
  • 省略了static final关键字和创建对象。
  • enum关键字还能对格式进行检查。
  • 2、注意事项
  • 定义枚举要用到关键字enum。
  • 所有枚举都是enum的子类。
  • 枚举类的第一行必须是枚举项,最后一个枚举项后的分号可以省略,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略分号。
  • 枚举类可以有构造器,但必须是private的,他的默认的构造器也是private的。
  • 枚举类也可以有抽象方法。但是枚举项必须重写该方法。
  • switch语句除了int及可自动转换为int的类型外还可以使用枚举

5、代码示例1

public enum Week2 {
    //定义变量,指向对象
    MON("星期一") ,TUE("星期二") ,WED("星期三") ,THU("星期四") ,FRI("星期五") ,SAT("星期六") ,SUN("星期日") ;
    
    String name ;
    //私有化构造
    private Week2(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

代码示例2

public static void main(String[] args) {
    Week2 week2 = Week2.MON;
    switch (week2) {
    case FRI:
            System.out.println("好高兴哦");
        break;
    case MON:
        System.out.println("过了星期三,越过越心宽");
        break;
    default:
        System.out.println("没有了");
        break;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。