1 基础知识
1.1 标准定义
原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1.2 分析和说明
原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种创建性模式。当一个系统应该独立于它的产品创建、构成和表示,以及当要实例化的类在运行时刻指定时,可使用原型模式。原型模式的缺点是每一个类都必须配备一个克隆方法。
Prototype的角色包括客户(client)角色、抽象原型(Prototype)角色和具体原型(Concrete Prototype)角色。
客户(client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型所需的接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所需要的接口。
2 应用场景举例
比如公司对于各个产品都有自己的宣传资料。每个宣传资料的组成都是首先对公司进行介绍。其次是对公司组织结构介绍,中间内容才是对产品的技术介绍,案例说明,最后还要留下公司的联系方式。所以,对于不同的产品的宣传资料中关于公司介绍、组织机构和公司的通信地址都是一样的。这样就可以采用Prototype。从基本的公司产品资料中克隆出来一个介绍模板,然后根据具体产品再说明各个产品的技术参数。
在这里可以把AbstractPrototype理解为抽象原型角色,CompanyBaseIntroduction是具体原型角色,其类图实现如下:
3 Java的实现程序代码
AbstractPrototype抽象类程序代码
public abstrat class AbstractPrototype{
public AbstractPrototype cloneMyself() { return this;}
public void addSomeIntroduction(String topic, String content){}
public void deleteSomeIntroduction(String key){}
public void showIntroduction(){}
}
CompanyBaseIntroduction具体原型代码
public class CompanyBaseIntroduction extends AbstractPrototype{
private Map<String , String> introductionMap = new Map<String, String>();
public CompanyBaseTntroduction(){}
public CompanyBaseIntroduction(Map<String, String>map){
introductionMap = map;
}
public AbstractPrototype cloneMyself(){
addSomeIntroduction("公司介绍", "这是公司基本介绍");
AbstractPrototype object = new CompanyBaseIntroduction(introductionMap);
return object;
}
public void addSomeIntroduction(String topic, String content){
introductionMap.add(topic, content);
}
public void deteleSomeIntroduction(String key){
if(introductionMap.containsKey(key)) introductionMap.remove(key);
}
public void addIntriductionMap(Map map){
inreoductionMap.putAll(map);
}
publilc Map getIntroductionMap(){
return introductionMap;
}
public void showIntroduction(){
Iterator it = introductionMap.ketSet().iterator();
String key, value;
while(it.hasNext()){
key = (String)it.next();
value = (String)introductionMap.get(key);
System.out.println("key:"+key+" value:"+value);
}
}
}
测试代码
public class Client{
public static void main(String[] args){
CompanyBaseIntroduction company = new CompanyBaseIntroduction();
AbstractPrototype departA = company.cloneMyself();
departA.addSomeIntroduction("部门A介绍", “这是部门A介绍的内容”);
departA.showIntroduction();
}
}
Key: 部门A介绍; value:这是部门A介绍的内容
Key: 公司介绍; value:这是公司基本介绍