Luckylau's Blog

设计模式之原型模式

​ 原型模式(Prototype Pattern)用于创建重复的对象,这种类型的设计模式属于创建型模式,与工厂模式类似,不同在于工厂模式通过new的方式创建对象,而原型模式通过复制既有对象的方式创建对象。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。使用原型模式有几点注意事项:

  1. 类本身或其父类必须实现Cloneable接口,并用publicclone()方法覆盖Object的同名方法;
  2. 根据实际情况判断是”浅复制“还是”深复制“,若深复制用序列化方式实现,则类本身或其父类须实现Serializable接口;
  3. 实际开发过程中注意业务逻辑,比如id等成员要保证不重复。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public abstract class Shape implements Cloneable {
protected String type;
protected String fillColor;
protected String frameColor;
protected String innerText;
@Override
public Shape clone() throws CloneNotSupportedException {
return (Shape)super.clone();
}
public abstract void draw();
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getFillColor() {
return fillColor;
}
public void setFillColor(String fillColor) {
this.fillColor = fillColor;
}
public String getFrameColor() {
return frameColor;
}
public void setFrameColor(String frameColor) {
this.frameColor = frameColor;
}
public String getInnerText() {
return innerText;
}
public void setInnerText(String innerText) {
this.innerText = innerText;
}
}
public class Circle extends Shape {
public Circle() {
this.type = "circle";
}
@Override
public void draw() {
System.out.println("Draw a " + type + ", fill with " + fillColor + ", frame color is " + frameColor + ", inner text is [" + innerText + "].");
}
}
public static void main(String[] args) throws CloneNotSupportedException {
Shape circle = new Circle();
circle.setFillColor("red");
circle.setFrameColor("green");
circle.setInnerText("Design patterns");
circle.draw();
Shape circle1 = circle1.clone();
circle1.draw();
}
Luckylau wechat
如果对您有价值,看官可以打赏的!