Java专题 单例模式与枚举总结

单例简单来说 一个类只有能创建一个对象,因为一般类可以创建多个对象。
将一个类的构造函数变为私有化,而创建的对象的方法固定为私有化构造方法创建出来的单个对象。
简单一点,不对外提供构造方法,提前将对象创建好,每次可以通过其他方法获得这个类的对象,但是这个对象每次都是同一个,也只有一个。

	//单例模式
//	在当前系统中,某个类型的对象,最多只能有一个,就需要使用单例设计模式
//	单例模式的设计原则:
// 	    构造方法私有化
//    提供公有的方法创建对象

	//单例中的饿汉式
	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();
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页