代码结构(详见代码注释2019-05-05):
package com.xingsfdz.prototype;
/**
*
* @类名称 Shape.java
* @类描述 <pre>形状接口继承Cloneable接口</pre>
* cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,
* 如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常
* @作者 xingsfdz xingsfdz@163.com
* @创建时间 2019年5月5日 下午9:17:00
* @版本 1.00
*
* @修改记录
* <pre>
* 版本 修改人 修改日期 修改内容描述
* ----------------------------------------------
* 1.00 xingsfdz 2019年5月5日
* ----------------------------------------------
* </pre>
*/
public interface Shape extends Cloneable{
//提供copy与计算方法
public Object clone(); //拷贝
public void countArea(); //计算面积
}
package com.xingsfdz.prototype;
/**
*
* @类名称 Circle.java
* @类描述 <pre>抽象-类型的实力-圆</pre>
* @作者 xingsfdz xingsfdz@163.com
* @创建时间 2019年5月5日 下午9:20:48
* @版本 1.00
*
* @修改记录
* <pre>
* 版本 修改人 修改日期 修改内容描述
* ----------------------------------------------
* 1.00 xingsfdz 2019年5月5日
* ----------------------------------------------
* </pre>
*/
public class Circle implements Shape {
@Override
public void countArea() {
System.out.println("圆面积=3.1415*r*r");
}
public Object clone(){
Circle w = null;
try {
w=(Circle)super.clone();
}
catch(CloneNotSupportedException e){
System.out.println("拷贝圆失败!");
}
return w;
}
}
package com.xingsfdz.prototype;
/**
*
* @类名称 Square.java
* @类描述 <pre>抽象-类型的实力-正方形</pre>
* @作者 xingsfdz xingsfdz@163.com
* @创建时间 2019年5月5日 下午9:22:58
* @版本 1.00
*
* @修改记录
* <pre>
* 版本 修改人 修改日期 修改内容描述
* ----------------------------------------------
* 1.00 xingsfdz 2019年5月5日
* ----------------------------------------------
* </pre>
*/
public class Square implements Shape {
@Override
public void countArea() {
System.out.println("该正方形的面积=aXa");
}
public Object clone() {
Square b = null;
try {
b=(Square)super.clone();
}
catch(CloneNotSupportedException e) {
System.out.println("拷贝正方形失败!");
}
return b;
}
}
package com.xingsfdz.prototype;
import java.util.HashMap;
import java.util.Map;
/**
*
* @类名称 ProtoTypeManager.java
* @类描述 <pre>原型管理器--使用一个容器来存储管理原型对象</pre>
* @作者 xingsfdz xingsfdz@163.com
* @创建时间 2019年5月5日 下午9:24:27
* @版本 1.00
*
* @修改记录
* <pre>
* 版本 修改人 修改日期 修改内容描述
* ----------------------------------------------
* 1.00 xingsfdz 2019年5月5日
* ----------------------------------------------
* </pre>
*/
public class ProtoTypeManager {
private Map<String, Shape> ht = new HashMap<String,Shape>();
public ProtoTypeManager() {
ht.put("Circle",new Circle());
ht.put("Square",new Square());
}
public void addshape(String key,Shape obj) {
ht.put(key,obj);
}
public Shape getShape(String key) {
Shape temp=ht.get(key);
return (Shape) temp.clone();
}
}
package com.xingsfdz.prototype;
/**
*
* @类名称 Test.java
* @类描述 <pre>测试</pre>
* @作者 xingsfdz xingsfdz@163.com
* @创建时间 2019年5月5日 下午9:26:47
* @版本 1.00
*
* @修改记录
* <pre>
* 版本 修改人 修改日期 修改内容描述
* ----------------------------------------------
* 1.00 xingsfdz 2019年5月5日
* ----------------------------------------------
* </pre>
*/
public class Test {
public static void main(String[] args) {
ProtoTypeManager pm = new ProtoTypeManager();//此处创建了对象,执行了构造,下面执行getShape就是原型模式来copy对象了,就不再次执行new以及构造方法了
Shape obj1=(Circle)pm.getShape("Circle");
obj1.countArea();
Shape obj2=(Shape)pm.getShape("Square");
obj2.countArea();
}
}
原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
特点:在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效。
与new比较(原型不执行构造函数):克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同,并且克隆出的新对象改变不会影响原型对象。
实现接口:Cloneable