图5、色子的类图。 下面就是多态类Die(色子)的源代码: package com.javapatterns.multilingual.dice; import java.util.Random; import java.util.Date; public class Die { PRivate static Die die1 = new Die(); private static Die die2 = new Die(); /** * 私有的构造子保证外界无法 * 直接将此类实例化 */ private Die() { } /** * 工厂方法 */ public static Die getInstance(int whichOne) { if (whichOne == 1) { return die1; } else { return die2; } } /** * 掷色子,返还一个在1到6之间的 * 随机数。 */ public synchronized int dice() { Date d = new Date(); Random r = new Random( d.getTime() ); int value = r.nextInt(); value = Math.abs(value); value = value % 6; value += 1; return value; } } 代码清单3、多态类的源代码。 在多态类Die中,使用了饿汉方式创建了两个Die的实例。根据静态工厂方法的参数,工厂方法返还两个事例中的一个。Die对象的dice()方法代表掷色子,这个方法会返还一个在1到6之间的随机数,相当于色子的点数。 package com.javapatterns.multilingual.dice; public class Client { private static Die die1, die2; public static void main(String[] args) { die1 = Die.getInstance(1); die2 = Die.getInstance(2); die1.dice(); die2.dice(); } } 代码清单4、客户端的源代码。 由于有上限的多态类对实例的数目有上限,因此有上限的多态类在这个上限等于1时,多态类就回到了单态类。因此多态类是单态类的推广,而单态类是多态类的非凡情况。 一个有上限的多态类可以使用静态变量储存所有的实例;非凡是在实例数目不多的时候,可以使用一个个的静态变量储存一个个的实例。在数目较多的时候,就需要使用静态聚集储存这些事例。 无上限多态模式 多态类的实例数目并不需要有上限[CAMP02];实例数目没有上限的多态模式就叫做无上限多态模式。 由于没有上限的多态类对实例的数目是没有限制的,因此虽然这种多态模式是单态模式的推广,但是这种多态类并不一定能够回到单态类。 由于事先不知道要创建多少个实例,因此必然是使用聚集治理所有的实例。本章要讨论的多语言支持方案就需要应用到多态模式,关于没有上限的多态模式的实现可以参见下面的讨论。