一.模式定义
原型模式是对象创建型模式。
Prototype Pattern: Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype.
用原型实例指定创建对象的种类,并且通过复制该原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。
二.模式要素
1.抽象原型
2.具体原型
3.使用者
三.举例说明
《黑客帝国》大家都看过,里面有一个反派角色Agent史密斯,就是下面这位。
能够通过复制来创造无数个自己,就像下面这样。
四.模式实例
工程结构如下:
1.Agent.java(实现Cloneable接口)
package prototype;
/**
* @program: DesignModes
* @description:Agent
* @author: Lei Dong
* @create: 2018-09-22 11:14
**/
public class Agent implements Cloneable {
private String name;
private String sex;
private String ability;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAbility() {
return ability;
}
public void setAbility(String ability) {
this.ability = ability;
}
@Override
public Agent clone() {
Agent agent = null;
try {
agent = (Agent) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return agent;
}
void showInfo() {
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + this.name);
System.out.println("性别:" + this.sex);
System.out.println("能力:" + this.ability);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
}
2.Main.java
package prototype;
/**
* @program: DesignModes
* @description:Main
* @author: Lei Dong
* @create: 2018-09-22 11:03
**/
public class Main {
public static void main(String[] args) {
Agent agent = new Agent();
agent.setName("史密斯");
agent.setSex("男");
agent.setAbility("自我复制、未来预知、飞行");
agent.showInfo();
Agent agent1 = agent.clone();
agent.showInfo();
agent1.setName("史密斯(克隆体)");
agent1.setSex("男(克隆体)");
agent1.setAbility("未来预知、飞行(克隆体)");
agent1.showInfo();
}
}
运行结果:
五.总结
1.原型模式的优点
(1)当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率。
(2)可以动态增加或减少产品类。
(3)可以使用深拷贝的方式保存对象的状态。
2.原型模式的缺点
(1)需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。
(2)在实现深拷贝时需要编写较为复杂的代码。
3.原型模式适用环境
在以下情况下可以使用原型模式:
(1)创建新对象成本较大,新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其属性稍作修改。
(2)系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。相反,如果对象的状态变化很大,或者对象占用的内存很大,那么采用状态模式会比原型模式更好。
(3)需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。