欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

原型模式Prototype

程序员文章站 2022-06-12 21:46:48
...
//Purpose.  Prototype design pattern

//1. Create a "contract" with clone() and getName() entries
//2. Design a "registry" that maintains a cache of prototypical objects
//3. Populate the registry with an initializePrototypes() function
//4. The registry has a findAndClone() "virtual constructor" that can transform
// a String into its correct object (it calls clone() which then calls "new")
//5. All classes relate themselves to the clone() contract
//6. Client uses the findAndClone() virtual ctor instead of the "new" operator

interface Prototype {
	Object clone();

	String getName();
} // 1. The clone()

interface Command {
	void execute();
} // contract

class PrototypesModule { // 2. "registry" of prototypical objs
	private static Prototype[] prototypes = new Prototype[9];
	private static int total = 0;

	public static void addPrototype(Prototype obj) {
		prototypes[total++] = obj;
	}

	public static Object findAndClone(String name) { // 4. The "virtual ctor"
		for (int i = 0; i < total; i++)
			if (prototypes[i].getName().equals(name))
				return prototypes[i].clone();
		System.out.println(name + " not found");
		return null;
	}
}

// 5. Sign-up for the clone()
class This implements Prototype, Command { // contract. Each class
	public Object clone() {
		return new This();
	} // calls "new" on itself

	public String getName() {
		return "This";
	} // FOR the client.

	public void execute() {
		System.out.println("This: execute");
	}
}

class That implements Prototype, Command {
	public Object clone() {
		return new That();
	}

	public String getName() {
		return "That";
	}

	public void execute() {
		System.out.println("That: execute");
	}
}

class TheOther implements Prototype, Command {
	public Object clone() {
		return new TheOther();
	}

	public String getName() {
		return "TheOther";
	}

	public void execute() {
		System.out.println("TheOther: execute");
	}
}

public class PrototypeDemo {
	public static void initializePrototypes() { // 3. Populate the "registry"
		PrototypesModule.addPrototype(new This());
		PrototypesModule.addPrototype(new That());
		PrototypesModule.addPrototype(new TheOther());
	}

	public static void main(String[] args) {
		initializePrototypes();
		Object[] objects = new Object[9];
		int total = 0;
		for (int i = 0; i < args.length; i++) { // 6. Client does not use "new"
			objects[total] = PrototypesModule.findAndClone(args[i]);
			if (objects[total] != null)
				total++;
		}
		for (int i = 0; i < total; i++)
			((Command) objects[i]).execute();
	}
}