原型模式(ProtoType)属于对象创建型模式,其典型应用情景是模板,比如邮件。某些邮件系统允许用户创建一个或几个信件模板。当需要写一封新邮件时,可以选择以前创建好的邮件模板。这样可以大大提高工作效率。这种情况下,就可以使用原型模式。将每一个邮件模板作为一个原型。写新邮件时,直接拷贝原型模板就可以。
一般情况下,系统允许用户创建多个模板,即可以存在多个原型。此时可以增加一个原型管理器来对各个原型进行管理,比如增加删除等等。
原型管理器在整个系统中一般只有一个实例,因而原型管理器可以采用单力模式。
示例如下:
package prototype;
public class DefaultTemplate implements Cloneable {
private static final String DEFAULT_TITLE = "Default";
private static final String DEFAULT_TAIL = "Default";
private String mTitle;
private String mTail;
public DefaultTemplate(){
mTitle = DEFAULT_TITLE;
mTail = DEFAULT_TAIL;
}
public DefaultTemplate(DefaultTemplate template){
mTitle = template.mTitle;
mTail = template.mTail;
}
public void setTitle(String title){
mTitle = title;
}
public String getTitle(){
return mTitle;
}
public void setTail(String tail){
mTail = tail;
}
public String getTail(){
return mTail;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Title: " + mTitle + " Tail: " + mTail;
}
}
package prototype;
import java.util.Hashtable;
import java.util.Map;
public class TemplateManager {
private Hashtable<String, DefaultTemplate> mTemplates = new Hashtable<>();
private static class HolderClass{
private static final TemplateManager instance = new TemplateManager();
}
private TemplateManager(){
}
public static TemplateManager getInstance(){
return HolderClass.instance;
}
public void registerTemplate(String name, DefaultTemplate template){
mTemplates.put(name, template);
}
public void removeTemplate(String name){
mTemplates.remove(name);
}
public DefaultTemplate getTemplate(String name){
return mTemplates.get(name);
}
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, DefaultTemplate> entry : mTemplates.entrySet()) {
builder.append(entry.getValue().toString()).append("\n");
}
return builder.toString();
}
}
package prototype;
public class ProtoType {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TemplateManager manager = TemplateManager.getInstance();
DefaultTemplate defaultTemplate = new DefaultTemplate();
manager.registerTemplate("default", defaultTemplate);
DefaultTemplate newTemplate1 = new DefaultTemplate(defaultTemplate);
newTemplate1.setTitle("new template 1");
newTemplate1.setTail("new template 1");
manager.registerTemplate("newtemplate1", newTemplate1);
DefaultTemplate newTemplate2 = new DefaultTemplate(newTemplate1);
manager.registerTemplate("newtemplate2", newTemplate2);
System.out.println(manager);
}
}