Skip to content

多例设计模式

单例设计模式只留下一个类的一个实例化对象,而多例设计模式,会定义出多个对象。例如:定义一个表示星期的操作类,这个类的对象只能有 7 个实例化对象(星期一到星期日);定义一个表示性别的类,只能有 2 个实例化对象(男、女),定义一个表示颜色基色的操作类,只能有 3 个实例化对象(红、绿、蓝)。这种情况下,这样的类就不应该由用户无限制地去创造实例化对象,应该只使用 有限 的几个,这个就属于多例设计。不管是单例设计还是多例设计,有一个核心不可动摇,即 构造方法私有化

java
package com.yootk.demo;
class Sex {
	private String title;
	private static final Sex MALE = new Sex("男");
	private static final Sex FEMALE = new Sex("女");
	private Sex(String title) { 				// 构造私有化了
		this.title = title;
	}
	public String toString() {
		return this.title;
	}
	public static Sex getInstance(int ch) {	// 返回实例化对象
		switch (ch) {
		case 1:
			return MALE;
		case 2:
			return FEMALE;
		default:
			return null;
		}
	}
}
public class TestDemo {
	public static void main(String args[]) {
		Sex sex = Sex.getInstance(2);
		System.out.println(sex);
	}
}
package com.yootk.demo;
class Sex {
	private String title;
	private static final Sex MALE = new Sex("男");
	private static final Sex FEMALE = new Sex("女");
	private Sex(String title) { 				// 构造私有化了
		this.title = title;
	}
	public String toString() {
		return this.title;
	}
	public static Sex getInstance(int ch) {	// 返回实例化对象
		switch (ch) {
		case 1:
			return MALE;
		case 2:
			return FEMALE;
		default:
			return null;
		}
	}
}
public class TestDemo {
	public static void main(String args[]) {
		Sex sex = Sex.getInstance(2);
		System.out.println(sex);
	}
}

本程序首先定义了一个描述性别的多例程序类,并且将其构造方法封装,然后利用 getInstance() 方法,接收指定编号后返回一个实例化好的 Sex 类对象。

可以利用接口标记编号

范例的代码利用数字编号来取得了一个 Sex 类的对象,但是会有读者觉得这样做表示的概念不明确,那么为了更加明确要取得对象类型,可以引入一个接口进行说明。

java
interface Choose {
	public int MAN = 1;							// 描述数字
	public int WOMAN = 2;							// 描述数字
}
public class TestDemo {
	public static void main(String args[]) {
		Sex sex = Sex.getInstance(Choose.MAN) ;	// 利用接口标记内容取得对象
		System.out.println(sex) ;
	}
}
interface Choose {
	public int MAN = 1;							// 描述数字
	public int WOMAN = 2;							// 描述数字
}
public class TestDemo {
	public static void main(String args[]) {
		Sex sex = Sex.getInstance(Choose.MAN) ;	// 利用接口标记内容取得对象
		System.out.println(sex) ;
	}
}

本程序如果要取得指定的 Sex 类对象,可以利用接口中定义的全局常量(实际上也可以在 Sex 类中定义一些全局常量)来进行判断。这样的做法是一种标准做法,但是这样做有一些复杂,所以利用字符串直接判断会更加简单一些。

在 JDK1.7 之前,switch 只能利用 intchar 进行判断,正因为如果纯粹是数字或字符意义不明确,所以增加了 String 的支持。

java
package com.yootk.demo;
class Sex {
	private String title;
	private static final Sex MALE = new Sex("男");
	private static final Sex FEMALE = new Sex("女");
	private Sex(String title) { 				// 构造私有化了
		this.title = title;
	}
	public String toString() {
		return this.title;
	}
	public static Sex getInstance(String ch) {
		switch (ch) {						// 利用字符串判断
			case "man":
				return MALE;
			case "woman":
				return FEMALE;
			default:
				return null;
		}
	}
}
public class TestDemo {
	 public static void main(String args[]) {
		 Sex sex = Sex.getInstance("man");
		 System.out.println(sex);
	}
}
package com.yootk.demo;
class Sex {
	private String title;
	private static final Sex MALE = new Sex("男");
	private static final Sex FEMALE = new Sex("女");
	private Sex(String title) { 				// 构造私有化了
		this.title = title;
	}
	public String toString() {
		return this.title;
	}
	public static Sex getInstance(String ch) {
		switch (ch) {						// 利用字符串判断
			case "man":
				return MALE;
			case "woman":
				return FEMALE;
			default:
				return null;
		}
	}
}
public class TestDemo {
	 public static void main(String args[]) {
		 Sex sex = Sex.getInstance("man");
		 System.out.println(sex);
	}
}

本程序直接使用 String 作为 switch 的判断条件,这样在取得实例化对象时就可以利用字符串来描述对象名字,这一点要比直接使用数字更加方便。

用心去做高质量的编程学习内容网站,欢迎star ⭐让更多人发现!