单例
简单来说 一个类只有能创建一个对象,因为一般类可以创建多个对象。
将一个类的构造函数变为私有化,而创建的对象的方法固定为私有化构造方法创建出来的单个对象。
简单一点,不对外提供构造方法,提前将对象创建好,每次可以通过其他方法获得这个类的对象,但是这个对象每次都是同一个,也只有一个。
//单例模式
// 在当前系统中,某个类型的对象,最多只能有一个,就需要使用单例设计模式
// 单例模式的设计原则:
// 构造方法私有化
// 提供公有的方法创建对象
//单例中的饿汉式
Ehan e1 = Ehan.getInstance();
Ehan e2 = Ehan.getInstance();
System.out.println(e1==e2); //都是同一个对象
//单例中的懒汉式
Lhan l1 = Lhan.getInstance();
Lhan l2 = Lhan.getInstance();
System.out.println(l1==l2); //都是同一个对象
class Lhan{ //懒汉单例
private Lhan() {}
private static Lhan l1 = null;
public static Lhan getInstance(){
//防止多线程时获得实例
synchronized (Lhan.class) { //可以不写 写了更安全 但锁会拖慢速度
if (l1 == null) {
synchronized (Lhan.class) {
if (l1 == null) { //在即将获取实例前再判断一次
l1 = new Lhan();
}
}
}
}
return l1;
}
}
class Ehan{ //饿汉单例 构造方法私有化,使得不能new对象从而对象唯一
private Ehan() {}
private static Ehan ehan = new Ehan(); //在类内部提前用静态创建对象
public static Ehan getInstance() { //提供公开的静态的获得唯一对象的方法
return ehan;
}
}
枚举
简单一点,将所有的的对象都提前创建出来,单例对外提供的对象只有一个,枚举对外提供的对象是多个但是都是确定的,也没有办法自己创建对象,都是创建好的。
//枚举
// 单例设计模式,设计出来的是某个类型的对象只有一个;枚举类型就是有多个对象的单例
// 设计模式,也可以称之为多例模式
// 声明一个枚举类型,使用的关键字是enum,声明出来的也是一个类,编译出来也是
// 一个.class的文件,只不过是补充了一些内容。
Week0 w01 = Week0.MON; //实现枚举的第一种格式
Week0 w02 = Week0.TUE;
// 使用枚举类型时,第一行必须出现枚举
// 枚举的是私有的构造方法,如果没有构造方法,会自动生成无参的私有的构造方法
// 枚举中构造方法必须是私有的
// 枚举类型中的方法使用跟类中的方法使用相似
// 枚举的类型的公共的父类Enum,不是Object类
//实现枚举的第二种格式
LH1 a1 = LH1.k1;
LH1 a2 = LH1.k2;
Week2 wa1 = Week2.MON;
System.out.println(wa1);
Week2 wa2 = Week2.FRI;
//实现枚举的第三种方法
//含有抽象方法的 具体类见下面
LHchou lkLHchou = LHchou.lhan;
LHchou lkLHchou2 = LHchou.lhan2;
EnumChou ec1 = EnumChou.A;
EnumChou ec2 = EnumChou.B;
ec1.show();
// 定义枚举类型必须使用enum关键字,创建的其实也是一个普通的类型。
// 所有的枚举项,必须定义在枚举类型的第一行,枚举项之间使用逗号分隔,最后一个枚举项之
// 后需要使用分号结尾
// 枚举类型也有构造方法,只能默认提供空参构造,需要我们手动定义有参构造。在枚举类型
// 中,所有的构造方法,都必须是私有化的。
// 枚举类型也可以有抽象方法,但是必须在枚举项中,将该方法实现。
//枚举类型中的方法
ec1.compareTo(ec2); //比较两个枚举项的位置 并返回差值
ec1.ordinal(); //返回该项在枚举中的位置系数
ec1.name(); //得到该枚举项的名字
ec1.toString(); //得到该枚举项的名字,可以重写
ec1.values(); //和Arrays.toString 方法使用 可以显示当前枚举中的所有枚举项
enum Week2{
MON("Monday"),TUE("Tuesday"),WED("Wesday"),THUE("Thursday"),FRI("Firday");
private String name;
private Week2() {}
private Week2(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "This is "+name;
}
}
enum Week0{ //实现枚举的第一种格式
MON,TUE,WED,THUE,FRI; //枚举第一句必须放枚举项 //相当于老汉式中提
//前定义好的多个唯一对象
}
有抽象方法的枚举类
enum EnumChou{
A("I'm a.") {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println(getName()+" show method.");
}
},B("I'm B.") {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println(getName()+" show method.");
}
},C("I'm C.") {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println(getName()+" show method.");
}
},D("I'm D") {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println(getName()+" show method.");
}
};
private String name;
private EnumChou() {}
private EnumChou(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return getName()+" de Tostring method.";
}
public abstract void show();
}