使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。
Class Diagram
 
Implementation
原型接口
| 12
 3
 4
 5
 
 | public interface Prototype {Prototype clone();
 String getName();
 void setName(String name);
 }
 
 | 
原型实例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 
 | public class ConcretePrototype1 implements Prototype {private String name;
 public Prototype clone() {
 ConcretePrototype1 prototype = new ConcretePrototype1();
 prototype.setName(this.name);
 return prototype;
 }
 
 public String getName() {
 return this.name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
 
 @Override
 public String toString() {
 return "Now , This Prototype is ConcretePrototype1 , name = "+this.name;
 }
 }
 
 public class ConcretePrototype2 implements Prototype {
 private String name;
 public Prototype clone() {
 ConcretePrototype2 prototype = new ConcretePrototype2();
 prototype.setName(this.name);
 return prototype;
 }
 
 public String getName() {
 return this.name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
 
 @Override
 public String toString() {
 return "Now , This Prototype is ConcretePrototype2 , name = "+this.name;
 }
 }
 
 | 
原型管理器(原型过多时使用)
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | public class PrototypeManager {
 private static Hashtable<String,Prototype> map = new Hashtable<String, Prototype>();
 
 public static void loadPrototype(){
 ConcretePrototype1 prototype1 = new ConcretePrototype1();
 prototype1.setName("prototype1");
 map.put(prototype1.getName(),prototype1);
 
 ConcretePrototype2 prototype2 = new ConcretePrototype2();
 prototype2.setName("prototype2");
 map.put(prototype2.getName(),prototype2);
 }
 
 public static Prototype getPrototype(String prototypeId){
 Prototype prototype = map.get(prototypeId);
 return prototype.clone();
 }
 }
 
 | 
测试类
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public class PrototypeTest {
 @Test
 public void test() throws Exception{
 PrototypeManager.loadPrototype();
 
 Prototype p1 = PrototypeManager.getPrototype("prototype1");
 System.out.println(p1);
 Prototype p2 = PrototypeManager.getPrototype("prototype2");
 System.out.println(p2);
 }
 }
 
 | 
Usage
- 对象之间相同或者相似,只有少部分属性不同
- 创建对象较为麻烦,复制对象较为简单时
Example
Refence