一、多例模式

多例模式实现方式一

package cn4;

public class MultiInstance {
	
	//提供有限个实例化对象
	public static final MultiInstance FRONT = new MultiInstance();
	public static final MultiInstance BEHIND = new MultiInstance();
	public static final MultiInstance LEFT = new MultiInstance();
	public static final MultiInstance RIGHT = new MultiInstance();
	
	//构造方法私有化
	private MultiInstance(){
		
	}
	
	

}
package cn4;

public class Test {
	public static void main(String[] args) {
		MultiInstance front = MultiInstance.FRONT;
		MultiInstance behind = MultiInstance.BEHIND;
		MultiInstance left = MultiInstance.LEFT;
		MultiInstance right = MultiInstance.RIGHT;
		
		System.out.println(front);
		System.out.println(behind);
		System.out.println(left);
		System.out.println(right);
		
	}
}

cn4.MultiInstance@15db9742

cn4.MultiInstance@6d06d69c

cn4.MultiInstance@7852e922

cn4.MultiInstance@4e25154f


多例模式实现方式二

package cn4;

public class MultiInstance2 {
	
	//提供有限个实例化对象
	public static final MultiInstance2 FRONT = new MultiInstance2("前");
	public static final MultiInstance2 BEHIND = new MultiInstance2("后");
	public static final MultiInstance2 LEFT = new MultiInstance2("左");
	public static final MultiInstance2 RIGHT = new MultiInstance2("右");
	
	private String name;
	
	
	//构造方法私有化
	private MultiInstance2(String name){
		this.name = name;
	}
	
	
	public String getName(){
		return this.name;
	}
	
	

}
package cn4;

public class Test2 {
	public static void main(String[] args) {
		MultiInstance2 front = MultiInstance2.FRONT;
		MultiInstance2 behind = MultiInstance2.BEHIND;
		MultiInstance2 left = MultiInstance2.LEFT;
		MultiInstance2 right = MultiInstance2.RIGHT;
		
		System.out.println(front);
		System.out.println(behind);
		System.out.println(left);
		System.out.println(right);
		
		
		System.out.println(front.getName());
		System.out.println(behind.getName());
		System.out.println(left.getName());
		System.out.println(right.getName());
	}
}

cn4.MultiInstance2@15db9742

cn4.MultiInstance2@6d06d69c

cn4.MultiInstance2@7852e922

cn4.MultiInstance2@4e25154f


多例模式实现方式三

package cn4;

public abstract class MultiInstance3 {
	
	//提供有限个实例化对象
	public static final MultiInstance3 FRONT = new MultiInstance3("前"){

		@Override
		public void show() {
			System.out.println("这是前面哦");
			
		}
		
	};
	public static final MultiInstance3 BEHIND = new MultiInstance3("后"){

		@Override
		public void show() {
			System.out.println("这是后面哦");
		}
		
	};
	public static final MultiInstance3 LEFT = new MultiInstance3("左"){

		@Override
		public void show() {
			System.out.println("左这是边哦");
		}
		
	};
	public static final MultiInstance3 RIGHT = new MultiInstance3("右"){

		@Override
		public void show() {
			System.out.println("这是后边哦");
		}
		
	};
	
	private String name;
	
	
	//构造方法私有化
	private MultiInstance3(String name){
		this.name = name;
	}
	
	
	public String getName(){
		return this.name;
	}
	
	public abstract void show();
	

}
package cn4;

public class Test3 {
	public static void main(String[] args) {
		MultiInstance3 front = MultiInstance3.FRONT;
		MultiInstance3 behind = MultiInstance3.BEHIND;
		MultiInstance3 left = MultiInstance3.LEFT;
		MultiInstance3 right = MultiInstance3.RIGHT;

		System.out.println(front);
		System.out.println(behind);
		System.out.println(left);
		System.out.println(right);
		
		System.out.println(front.getName());
		System.out.println(behind.getName());
		System.out.println(left.getName());
		System.out.println(right.getName());
		
		front.show();
		behind.show();
		left.show();
		right.show();
	
	}
}

cn4.MultiInstance3$1@15db9742

cn4.MultiInstance3$2@6d06d69c

cn4.MultiInstance3$3@7852e922

cn4.MultiInstance3$4@4e25154f

这是前面哦

这是后面哦

左这是边哦

这是后边哦


但是如果我们写多例模式也这样实在是太麻烦了。jdk为我们提供了枚举。

根据多例模式实现一对应的枚举一

package cn4;

public enum Color {
	RED,GREEN,BLUE;
}
package cn4;

public class ColorTest1 {
	public static void main(String[] args) {
		Color red = Color.RED;
		Color green = Color.GREEN;
		Color blue = Color.BLUE;
		
		System.out.println(red);
		System.out.println(green);
		System.out.println(blue);
	}

}

RED

GREEN

BLUE


根据多例模式实现二对应的枚举二

package cn4;

public enum Color2 {
	RED("红"),GREEN("绿"),BLUE("蓝");
	
	
	private String name;
	private Color2(String name){
		this.name = name;
	}
	
	public String getName(){
		return this.name;
	}
	
}
package cn4;

public class ColorTest2 {
	public static void main(String[] args) {
		Color2 red = Color2.RED;
		Color2 green = Color2.GREEN;
		Color2 blue = Color2.BLUE;
		
		System.out.println(red);
		System.out.println(green);
		System.out.println(blue);
		
		System.out.println(red.getName());
		System.out.println(green.getName());
		System.out.println(blue.getName());
	}

}

RED

GREEN

BLUE

绿


根据多例模式实现三对应的枚举三

package cn4;

public enum Color3 {
	RED("红"){
		@Override
		public void show() {
			System.out.println("这是红色");
		}},GREEN("绿"){

			@Override
			public void show() {
				System.out.println("这是绿色");
			}},BLUE("蓝"){

				@Override
				public void show() {
					System.out.println("这是蓝色");
				}};
	
	
	private String name;
	private Color3(String name){
		this.name = name;
	}
	
	public String getName(){
		return this.name;
	}
	
	public abstract void show();
}

RED

GREEN

BLUE

绿

这是红色

这是绿色

这是蓝色


二、枚举的注意事项

定义枚举类要用关键字enum。

所有枚举类密度是Enumerate的子类。

枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略。

枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”)。

枚举类也可以有抽象方法,但是枚举项必须重写该方法。

枚举可以在switch语句中的使用。


三、枚举类的几个常用方法

int compareTo(E o)

String name()

int ordinal()

String toString()

<T> T valueOf(Class<T> type,String name)

values() 

此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

package cn4;

public enum Color {
	RED,GREEN,BLUE;
}
package cn4;

public class ColorDemo {
	public static void main(String[] args) {
		//int compareTo(E o) 比较此枚举与指定对象的顺序
		Color red = Color.RED;
		Color green = Color.GREEN;
		Color blue = Color.BLUE;
		System.out.println(red.compareTo(red));//0
		System.out.println(red.compareTo(green));//-1
		System.out.println(blue.compareTo(red));//2
		
		System.out.println("-------------------------");
		
		//String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
		System.out.println(Color2.RED.name());//RED
		System.out.println(Color2.GREEN.name());//GREEN
		System.out.println(Color2.BLUE.name());//BLUE
		
		System.out.println("-------------------------");
		
		//int ordinal() 返回枚举常量的序数
		System.out.println(Color3.RED.ordinal());//0
		System.out.println(Color3.GREEN.ordinal());//1
		System.out.println(Color3.BLUE.ordinal());//2
		
		System.out.println("-------------------------");
		
		//String toString() 返回枚举常量的名称
		System.out.println(Color3.RED.toString());//RED
		System.out.println(Color3.GREEN.toString());//GREEN
		System.out.println(Color3.BLUE.toString());//BLUE
		
		System.out.println("-------------------------");
		
		//<T> T valueOf(Class<T> type,String name) 返回带指定名称的指定枚举类型的枚举常量
		Color color = Enum.valueOf(Color.class, "RED");
		System.out.println(color);//RED
		
		System.out.println("-------------------------");
		//values() 获取指定枚举类的枚举数组
		Color[] colors = Color.values();
		for (Color c : colors) {
			System.out.println(c);//RED GREEN BLUE
		}
		
		
		
		
	}

}

0

-1

2

-------------------------

RED

GREEN

BLUE

-------------------------

0

1

2

-------------------------

RED

GREEN

BLUE

-------------------------

RED

-------------------------

RED

GREEN

BLUE