当前位置: 首页 > 科技观察

设计模式系列-原型模式

时间:2023-03-20 11:58:17 科技观察

原型模式其实很简单,就是利用Java提供的Clonable接口实现对象的复制。之所以叫原型模式,是因为我们在复制的时候需要一个原型或者模型。这种模式常用于创建的对象比较复杂的时候,我们可以直接在已有对象的基础上复制一个直接使用。在使用原型模式时,要考虑Java的深拷贝和浅拷贝。当需要深拷贝时,建议通过序列化来实现。举例说明通过图形缓存使用原型模式。先来看看UML:下面给出一个简单的图形缓冲区来演示原型模式(浅拷贝)。publicabstractclassShapeimplementsCloneable{privateStringid;protectedStringtype;abstractvoiddraw();//因为篇幅关系,这里省略了get和set方法//注意这段代码,重点在这里。@OverrideprotectedObjectclone(){Objectclone=null;try{clone=super.clone();}catch(CloneNotSupportedExceptione){e.printStackTrace();}returnclone;}}定义一个Circle来实现ShapepublicclassCircleextendsShape{publicCircle(){type="Circle";}@Overridevoiddraw(){System.out.println("InsideCircle::draw()method");}}定义了一个图形缓冲区,它存储创建的图形。当客户端需要一个新的图形时,直接从图形缓冲区中复制一个。publicclassShapeCache{privatestaticMapshapeMap=newHashMap<>();publicstaticShapegetShape(StringshapeId){ShapecacheShape=shapeMap.get(shapeId);//通过克隆.clone();返回一个新的Circlereturn(Shape)cacheShape与现有的Circle完全相同;}//创建一个新的Circle并将其放入缓存publicstaticvoidloadCache(){Circlecircle=newCircle();circle.setId("1");shapeMap.put(circle.getId(),circle);}}客户端使用publicclassPrototypePatternDemo{publicstaticvoidmain(String[]args){//创建一个新的Cirlce并放入缓存中ShapeCache.loadCache();//通过cloning=ShapeCache.getShape("1");System.out.println("Shape:"+cloneShape.getType()+"ID:"+cloneShape.getId());}}总结原型模式很简单,是一种创建模式一,只记得原型模式是使用Cloneable来复制对象。本文参考:https://www.tutorialspoint.com/design_pattern/prototype_pattern.htm