我们已经学习过了工厂模式和创建者模式,可是有一个问题。比如有一个对象,在某一个时刻该对象中已经包含了一些有效值,此时可能会需要一个和该对象完全相同的新对象,并且此后对新对象的任何改动都不会影响到原来对象中的值,也就是说,新对象与原来的对象是两个独立的对象,但新对象的初始值是由原来的对象确定的。关于上面问题的解决方案,就是我们今天所要将的“原型模式”。
定义:原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个原型对象的方法来创建更多同类型的对象。
组成:从前面的介绍可以总结出,原型模式主要由两部分组成:抽象原型类和具体原型类。
java代码如下(我们借用实现Cloneable):
//定义狗类
public class Dog {
public int legCounts;
public Dog(int legCounts)
{
this.legCounts = legCounts;
}
public void changeLegCounts()
{
this.legCounts = legCounts*2;
}
public String toString()
{
return Integer.toString(this.legCounts);
}
}
//克隆狗类
public class DogClone implements Cloneable{
public int legCounts;
public Dog dog = new Dog(4);
public Object clone()
{
DogClone o = null;
try{
o = (DogClone)super.clone();
}catch(Exception e){
}
return o;
}
}
//客户端运行程序
public class Client {
public static void main(String[] args) {
DogClone dogClone = new DogClone();
dogClone.legCounts = 3;
System.out.println("原来的克隆狗腿的数量:" + dogClone.legCounts);
System.out.println("原来的普通狗腿的数量:" + dogClone.dog.toString());
DogClone dogClone1 = (DogClone)dogClone.clone();
dogClone1.legCounts = 2;
Dog dog = dogClone1.dog;
dog.changeLegCounts();
System.out.println("克隆后原来狗腿的数量:" + dogClone.legCounts);
System.out.println("克隆后原来狗腿的数量:" + dogClone.dog.toString());
System.out.println("克隆后克隆狗腿的数量:" + dogClone1.legCounts);
System.out.println("克隆后普通狗腿的数量:" + dogClone1.dog.toString());
}
}
使用时机:当系统需要创建的对象是动态加载的,而且产品具有一定的层次时,需要使用原型模式。
优点:在原型模式中,可以动态的添加产品类,而且对整体结构没有影响。
缺点:由于原型模式需要给每一个类都配备一个克隆的方法,这就需要在设计类时通盘考虑,因为在已有类的基础上来添加Clone操作是比较困难的;而且原型模式在实现深层次的复制时,需要编写一定量的代码。