示例程序
Product 接口
// Product interface
package framework;
public interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product createClone();
}
Manager 类
// Manager
package framework;
import java.util.*;
public class Manager {
private HashMap<String,Product> showcase = new HashMap<>();
public void register(String name,Product product){
showcase.put(name,product);
}
public Product create(String productName){
Product p = (Product)showcase.get(productName);
return p.createClone();
}
}
MessageBox 类
// MsessageBox
import framework.*;
public class MessageBox implements Product {
private char decochar;
public MessageBox(char decochar){
this.decochar = decochar;
}
public void use(String s){
int length = s.length();
for(int i = 0;i < length + 4;i++){
System.out.print(decochar);
}
System.out.println("");
System.out.println(decochar + " " + s + " " + decochar);
for(int i = 0;i < length + 4;i++){
System.out.print(decochar);
}
System.out.println("");
}
public Product createClone(){
Product p = null;
try{
p = (Product)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return p;
}
}
Main 类
// Main
public class Main {
public static void main(String[] args){
Manager manager = new Manager();
MessageBox box1 = new MessageBox('*');
MessageBox box2 = new MessageBox('-');
MessageBox box3 = new MessageBox('/');
manager.register("aster",box1);
manager.register("minus",box2);
manager.register("slash",box3);
Product p1 = manager.create("aster");
p1.use("Hello");
Product p2 = manager.create("minus");
p2.use("Hello");
Product p3 = manager.create("slash");
p3.use("Hello");
}
}
该程序输出的结果为:
*********
* Hello *
*********
---------
- Hello -
---------
/////////
/ Hello /
/////////
Prototype 模式中的角色
Prototype
Prototype 即原型,其作用为负责定义用于复制现有实例来生成新的实例的方法。在示例程序中由Product接口扮演这个角色。
ConcretePrototype
ConcretePrototype是Prototype的实现;该角色负责实现复制现有实例并生成新实例的方法,在示例程序中,由MessageBox类扮演此角色。
Client
Client角色负责使用复制实例的方法生成新的实例。示例程序中,由Manager类扮演此角色。
Prototype模式的UML
对于Prototype模式的思考
怎样理解Cloneable接口与Object的clone方法
对于这个问题的思考,请参见我的文章 Cloneable接口
为什么要使用Prototype模式
- 运行时刻增加和删除产品。
Prototype允许只通过客户注册原型实例就可以将一个新的具体产品类并入系统。它比其他创建型模式更为灵活,因为客户可以在运行时刻动态建立和删除原型。 - 改变值以指定新对象
- 减少子类的构造
同工厂方法模式比较,工厂方法需要一个与产品类平行的creator。而Prototype模式则仅仅是克隆一个原型,而不是请求一个工厂方法去产生一个新的对象 - 用类动态配置应用