原型模式 (Prototype Pattern)

用于创建重复的对象,同时又能保证性能。当直接创建对象的代价比较大时,则采用这种模式。

import java.util.Hashtable;

public class Main {
    
    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());
    }
}

class ShapeCache {
    
    private static Hashtable<String,Shape> shapeMap = new Hashtable<>();
  
    // 返回它们的克隆
    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);
    }
}

// 实现了 Cloneable 接口的抽象类。
abstract class Shape implements Cloneable {
    
    private String id;
    protected String type;
    
    abstract void draw();
    
    @Override
    public Object clone() {
         Object clone = null;
         try {
             clone = super.clone();
         } catch (CloneNotSupportedException e) {
             e.printStackTrace();
         }
         return clone;
     }
    
    public String getType(){
        return type;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}

class Rectangle extends Shape {
    
    public Rectangle(){
        type = "Rectangle";
    }
  
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

class Square extends Shape {
    
    public Square(){
        type = "Square";
    }
  
    @Override
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

class Circle extends Shape {
    
    public Circle(){
        type = "Circle";
    }
  
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

 

posted @ 2022-04-26 15:40  HanselHuang  阅读(42)  评论(0编辑  收藏  举报