在做软设真题的时候,2013年上半年也考了原型(Prototype)模式,但是跟答案相差甚远,没想到还有那种强制类型转换的,太操蛋了。如果标准答案,我能得到7分,丢了8分那就太不应该了,今天特意学习记下Prototype模型,虽然是为了应付软考,但其实更加是为了能灵活使用设计模式的应用。
案例
现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。
现采用原型模式(Prototype)来实现上述要求,得到下图所示的类图。
不完整代码如下:
interface Cloneable {
public Object clone();
}
public class WorkExperience (1) Cloneable { //工作经历
private String workDate;
private String company;
public Object clone(){
(2);
Obj.workDate= this.workDate;
Obj.company = this.company;
return Obj;
}
}
public class Resume (3) Cloneable{ //简历
private String name;
private String sex;
private String age;
private WorkExperience work;
public Resume(string name)
{
this.name = name;
work = new WorkExperience();
}
private Resume(WorkExperience work)
{
this.work = (4);
}
public void SetPersonInfo(string sex,string age){/*实现省略*/}
public void SetWorkExperience(string workDate,string company){/*实现省略*/}
public Object clone(){
Resume Obj = (5);
return Obj;
}
}
Class WorkResume{
public static void main(){
Resume a = new Resume("张三");
a.SetPersonInfo("男","29");
a.SetWorkExperience("1998-2000","XXX公司");
Resume b = (6);
b. SetWorkExperience("2001-2006","YYY公司");
}
}
标准答案是:
但我认为也可以是如下的答案:
(1) implements
(2) WorkExperience obj = new WorkExperience()
(3) implements
(4) work
(5) new Resume((WorkExperience)work.Clone())
(6) (Resume)a.Clone()
这里容易忽略的地方就是4和6有一个强制类型转换,如论笔试还是考试,稍有不慎就容易出错。
意图
用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
结构图
其中,
- Prototype声明一个复制自身的接口。
- ConcretePrototype实现一个复制自身的操作。
- Client让一个原型复制自身从而创建一个新的对象。
适应性
- 当一个系统应该独立于它的产品创建、构成和表示时。
- 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
- 为了避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。