创建型设计模式原型模式
Posted riches
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型设计模式原型模式相关的知识,希望对你有一定的参考价值。
一、一句话背景
假如我是个设计大佬,我经常需要调用服务去获取各种基本图形来组合我的素材,那重复访问的工作就会很多,那在没有外置缓存的情况下,可以考虑使用原型模式来玩~
二、使用场景
需要重复生成多次相同对象的场景。
如:重复取相同对象使用时
三、模型分析
图形原型:抽象类,原型父类,用于扩展子类对象,并进行复用
具体图形:类,图形父类的多样化拓展
模拟缓存:类,用于模拟缓存具体的对象,并提供复制方法
四、代码分析
图形原型
/** * 形状类,原型父类,用于扩展子类对象,并进行复用 */ public abstract class Shape implements Cloneable private String id; protected String type; public abstract void draw(); public String getType() return type; public String getId() return id; public void setId(String id) this.id = id; public Object clone() Object clone = null; try clone = super.clone(); catch (CloneNotSupportedException e) e.printStackTrace(); return clone;
具体图形
/** * 圆形类 */ public class Circle extends Shape public Circle() type = "Circle"; @Override public void draw() System.out.println("Inside Circle::draw() method.");
/** * 矩形类 */ public class Rectangle extends Shape public Rectangle() type = "Rectangle"; @Override public void draw() System.out.println("Inside Rectangle::draw() method.");
/** * 正方形类 */ public class Square extends Shape public Square() type = "Square"; @Override public void draw() System.out.println("Inside Square::draw() method.");
模拟缓存
/** * 模拟缓存类,用于复制拓展的对象 */ public class ShapeCache //这个map里存好了对象,用的时候直接调用本类的getShape来clone就好 private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>(); //static可以把这个方法给其他类调用,直接clone设置好的map里的对象,就不用每次都new一个对象 public static Shape getShape(String shapeId) Shape cachedShape = shapeMap.get(shapeId); return (Shape) cachedShape.clone(); // 对每种形状都运行数据库查询,并创建该形状 // shapeMap.put(shapeKey, shape); // 例如,我们要添加三种形状 public static void loadCache() Circle circle = new Circle(); circle.setId("1"); shapeMap.put(circle.getId(), circle); Square square = new Square(); square.setId("2"); shapeMap.put(square.getId(), square); Rectangle rectangle = new Rectangle(); rectangle.setId("3"); shapeMap.put(rectangle.getId(), rectangle);
克隆调用
/** * 模拟克隆调用 */ public class PrototypePatternDemo public static void main(String[] args) ShapeCache.loadCache(); Shape clonedShape = (Shape) ShapeCache.getShape("1"); System.out.println("Shape : " + clonedShape.getType()); Shape clonedShape2 = (Shape) ShapeCache.getShape("2"); System.out.println("Shape : " + clonedShape2.getType()); Shape clonedShape3 = (Shape) ShapeCache.getShape("3"); System.out.println("Shape : " + clonedShape3.getType());
以上是关于创建型设计模式原型模式的主要内容,如果未能解决你的问题,请参考以下文章