单例模式

1、在当前系统中,某个类型的对象,最多只能有一个,就需要使用单例设计模式

2、几种格式

//老汉式

classWeekDay1{//1.构造方法私有化

privateWeekDay1() {}//2.创建静态常量对象

public static final WeekDay1 MON = newWeekDay1();

}//饿汉式

classWeekDay2{//1.构造方法私有化

privateWeekDay2() {}//2.创建本类静态私有对象

private static WeekDay2 Mon = newWeekDay2();//3.对外提供私有对象的访问

public staticWeekDay2 getInstance() {returnMon;

}

}//懒汉式

classWeekDay3

{//1.构造方法私有化

privateWeekDay3(){}//2.声明本类私有对象

private staticWeekDay3 Mon;//3.判断并创建对象

public staticWeekDay3 getInstance(){if(Mon==null){

Mon= newWeekDay3();

}returnMon;

}

}

3、问题:单例模式会不会产生线程安全问题?如何解决?会不会影响效率?如何提升效率?

单例模式的懒汉式会产生线程安全问题,可以使用同步代码块解决,效率问题看下面代码

classWeekDay3

{//1.构造方法私有化

privateWeekDay3(){}//2.声明本类私有对象

private staticWeekDay3 Mon;//3.判断并创建对象

public staticWeekDay3 getInstance(){//因为只有第一次才会判断,所以再判断一次可以提高效率

if(Mon==null) {//加同步代码块可以解决线程不安全的问题,但效率会变低

synchronized (WeekDay3.class) {if(Mon==null){

Mon= newWeekDay3();

}

}

}returnMon;

}

}

枚举

1、什么是枚举?

描述对象个数有限的类

2、本质上是有多个对象的单例设计模式

3、关键字enum,声明出来也是一个类,编译也是.class文件

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

abstract class WeekDay1{//WeekDay2的对比类

String name;privateWeekDay1() {}public abstract voidrun();private WeekDay1(String name) {this.name=name;}public static final WeekDay1 MON = new WeekDay1("1") {

@Overridepublic voidrun() {//TODO Auto-generated method stub

}

};public static final WeekDay1 TUE = new WeekDay1("2") {

@Overridepublic voidrun() {//TODO Auto-generated method stub

}

};public static final WeekDay1 WEN = new WeekDay1("3") {

@Overridepublic voidrun() {//TODO Auto-generated method stub

}

};

}enum WeekDay2{//可以实现抽象方法,直接写在对象后的大括号内

MON("1"){

@Overridepublic voidrun() {

}

},TUE("2"){

@Overridepublic voidrun() {

}

},WEN("3"){

@Overridepublic voidrun() {

}

};

String name;public void setName(String name) {this.name=name;}public String getName() {returnname;}private WeekDay2(String name) {this.name =name;}public abstract voidrun();

}enumWeekDay3{

MON,TUE,WEN;//相当于普通类中public static final WeekDay3 MON=new WeekDay3();..

}enum WeekDay4{//可以定义属性,直接写在对象名后的()内

MON("1"),TUE("2"),WEN("3");privateString name;privateWeekDay4(String name) {this.name =name;

}

}

枚举

4、注意事项

所有的枚举项必须写在枚举类型的第一行,枚举项之间使用逗号隔开,最后用分号结束。

枚举类中也有构造方法,只能默认空参构造,需手动定义有参构造,所有的构造方法必须是私有化的。

枚举类型可以有抽象方法,但必须在枚举项实现。

5、枚举类型常用方法

1、所有使用enum关键字声明的类型,全都是Enum类型的子类

2、常用特有方法:

compareTo(E e):用于比较两个枚举项的顺序,如果调用者序号小返回负数;如果调用者序号大,则返回正数;

ordinal():返回的就是枚举项的系数

name():返回该对象的对象名称(枚举项的名称),不能重写

toString():返回该对象的对象名称(枚举项的名称),可以重写

values():返回该枚举类型的所有枚举项(API中没有,但是可以调用)

更多推荐