多例设计模式
设计一个Java类,这个Java类只可以实例化出固定的几个对象。这种设计就称为多例设计模式。
例如,一个表示性别的类Sex,只有可能实例化两个对象,一个表示“男”一个表示“女”:
public class Sex {
public static final Sex man = new Sex("男");
public static final Sex women = new Sex("女");
private String name;
private Sex(String name){
this.name=name;
}
@Override
public String toString(){
return this.name;
}
}
多例设计模式有以下几个要点:
- 构造方法私有
- 在类的内部用静态常量实例化一个本类
枚举
枚举是简化的多例设计模式。用enum关键字可以轻松实现这样一个类
public enum SexEnum {
MAN,WOMAN;
}
使用枚举
public static void main(String[] args) {
System.out.println(SexEnum.MAN);//MAN
System.out.println(SexEnum.WOMAN);//WOMAN
for(SexEnum sex:SexEnum.values()){
System.out.println(sex.name());
System.out.println(sex.ordinal());
}
}
定义其他结构
枚举的本质是多例设计模式,枚举内部自然也可以定义其他的结构
public enum SexEnum {
MAN("男"),WOMAN("女");
private String sexName;
private SexEnum(String sexName){
this.sexName=sexName;
}
@Override
public String toString(){
return this.sexName;
}
}
有两点需要注意:
- 枚举对象必须写在首行
- 构造方法私有
枚举实现接口
public interface getSexName {
String getSexName();
}
public enum SexEnum implements getSexName{
MAN("男"),WOMAN("女");
private String sexName;
private SexEnum(String sexName){
this.sexName=sexName;
}
@Override
public String toString(){
return this.sexName;
}
@Override
public String getSexName() {
return this.sexName;
}
}
枚举中的对象MAN和WOMAN就都实现了GetSexName接口。
枚举也可以让其中的对象分别覆写接口:
public enum SexEnum implements getSexName{
MAN("男"){
public String getSexName(){
return "男";
}
},
WOMAN("女"){
public String getSexName(){
return "女";
}
};
private String sexName;
private SexEnum(String sexName){
this.sexName=sexName;
}
@Override
public String toString(){
return this.sexName;
}
}
在switch语句中使用枚举
public static void main(String[] args) {
SexEnum e = SexEnum.MAN;
switch (e){
case MAN:
System.out.println("是个男的");
break;
case WOMAN:
System.out.println("是个女的");
break;
}
}