设计模式之-原型模式

代码结构(详见代码注释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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值