原型模式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();
}
}
上一篇: python正则表达式re模块详细介绍
下一篇: 原型模式