作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(WPS二次开发QQ群:250325397),摸鱼吹牛嗨起来!
目录
原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
创建重复的对象。
注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。
原型模式包含以下主要角色。
抽象类和具体实现类
- /**
- * 形状,抽象类
- */
- public abstract class Shape implements Cloneable {
- /**
- * 边框颜色
- */
- protected int borderColor;
-
- /**
- * 边框样式,0:实现;1:虚线
- */
- protected int borderStyle;
-
- /**
- * 绘制
- */
- public abstract void draw();
-
- public int getBorderColor() {
- return borderColor;
- }
-
- public void setBorderColor(int borderColor) {
- this.borderColor = borderColor;
- }
-
- public int getBorderStyle() {
- return borderStyle;
- }
-
- public void setBorderStyle(int borderStyle) {
- this.borderStyle = borderStyle;
- }
-
- @Override
- public Shape clone() {
- try {
- return (Shape) super.clone();
- } catch (CloneNotSupportedException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
-
- /**
- * 圆形
- */
- public class Circle extends Shape {
- @Override
- public void draw() {
- System.out.println("draw circle begin...");
- }
- }
-
- /**
- * 矩形
- */
- public class Rectangle extends Shape {
- @Override
- public void draw() {
- System.out.println("draw rectangle begin...");
- }
- }
原型管理器
- /**
- * 形状管理器
- */
- public class ShapeTypeManager {
- private Map
shapeMap = new HashMap<>(); -
- public ShapeTypeManager() {
- //初始化时内置一些形状
- shapeMap.put("Circle", new Circle());
- shapeMap.put("Rectangle", new Rectangle());
- }
-
- /**
- * 添加形状
- * @param shapeName 形状名称
- * @param shape 形状对象
- */
- public void addShape(String shapeName, Shape shape) {
- shapeMap.put(shapeName, shape);
- }
-
- /**
- * 获取形状
- */
- public Shape getShape(String shapeName) {
- Shape shape = shapeMap.get(shapeName);
- if (shape == null) {
- return null;
- }
- return shape.clone();
- }
- }
具体使用
- public class App {
- public static void main(String[] args) {
- ShapeTypeManager shapeTypeManager = new ShapeTypeManager();
- Shape circle = shapeTypeManager.getShape("Circle");
- System.out.println("circle:" + circle);
- circle.draw();
-
- Shape rectangle = shapeTypeManager.getShape("Rectangle");
- System.out.println("rectangle:" + rectangle);
- rectangle.draw();
- }
- }
对象池、数据库连接池、线程池等。