一、单例模式
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;
}
}