设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。下面我们来介绍其中一种设计模式。
原型模式是一个创建型的模式,所谓原型就是有一个样板示例,用户可以从这个样板示例对象中复制出一个内部属性一致的对象
被复制的示例我们称它为“原型”,原型模式适用于创建耗时的或复杂的对象,因为此时直接复制一个存在的对象会使程序运行更为高效运行。
原型模式的使用场景:
(1)类初始化的时候消耗很多的资源,通过原型拷贝避免这些消耗。
(2)new对象时需要非常多的数据准备或访问权限。
(3)一个对象要提供给其他对象访问,而且各个调用者都可能修改其值时,可以用原型模式拷贝多个对象让调用者使用。
下面咱们先来介绍下咱们要写的东西
1.Client客户端
2.Prototype:抽象类或接口,具备clone(克隆)能力。
3.具体的原型类
下面我们来做一个简单的示例:我们先创建了一个文档对象Word,在这个Word中有图片和文字,用户经过很长时间内容编辑后,打算进一步编辑,但修改后的不一定适用,所以我们要先拷贝一份,以防万一。然后再在拷贝文件上进行修改。这个要被拷贝的文档就是原型。
这个文档相当于原型类,cloneable接口代表具备克隆能力的Prototype。
public class Word implements Cloneable {
private String text;//文本
private ArrayList<String> image = new ArrayList<String>();//图片集合
public Word() {
System.out.println("word的构造方法");
}
@Override
//用于克隆的方法也是实现Cloneable接口重写的方法clone()
protected Word clone() {
try {
Word doc = (Word) super.clone();
doc.image = this.image;
doc.text = this.text;
return doc;
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public ArrayList<String> getImage() {
return image;
}
public void addImage(String img) {
this.image.add(img);
}
/*
* 打印文档内容
*/
public void showWord() {
System.out.println("word start--------------");
System.out.println("text:" + text);
for (String imagename : image) {
System.out.println("iamge name:" + imagename);
}
System.out.println("word end--------------");
}
}
我们通过Word这个类描述了这个文档中额基本元素:即文字和图片,这个类我们就把它看作原型,Clonebable这个接口我们把它看作Prototype:抽象类或接口,具备clone(克隆)能力。
**这里注意一下clone()方法并不是Clonebable这个接口中的方法,而是object中的方法。Cloneable接口只是作为一个文件可拷贝的标识,否则直接调用clone()方法会抛出异常。**
下面咱们再来看看客户端的代码:
public class Client {
public static void main(String[] args) {
//构建文档对象
Word b = new Word();
//编辑文档,添加文字图片等。
b.setText("这是word");
b.addImage("图片一");
b.addImage("图片二");
b.showWord();
/*
* 以原始文档为原型,开始拷贝一个新文档
*/
Word doc2 = b.clone();
doc2.showWord();
/*
* 修改拷贝的文件,不会影响原始文档
*/
doc2.setText("这是拷贝的文本");
doc2.showWord();
b.showWord();
}
}
下面我们来看看运行结果:
我们可以看到doc2是b.clone()创建的,并且doc2第一次输出和b 的输出是一样的,doc2就是 b 的拷贝文件,内容相同,doc2的文本修改后不会影响到 b 的文本。这就保证了 b 的安全性。
注意一点:执行clone方法时克隆时不会执行构造方法,所以当你想在构造方法里进行某些初始化时要多留意一下。
好了,上面就是原型设计模式简单的实现。大家可以自己更深入地去研究哦。