摘要:例如,在执行代价较高的数据库操作后创建对象。引用来自脚本之家博客原型模式深拷贝与浅拷贝实现我们将创建一个抽象的类和继承这个抽象类的子类。第一步创建一个抽象类实现接口。
设计模式-原型模式原文链接
译者:smallclover
个人翻译,水平有限,如有错误欢迎指出,谢谢!
原型模式是指创建对象的副本,同时保持性能。这种类型的设计模式是创建型设计模式下创建对象最好的方式之一。
这个模式需要实现一个原型接口,并通知它创建一个当前对象的一个副本。这种模式在直接创建一个对象代价非常高昂的时候使用。例如,在执行代价较高的数据库操作后创建对象。我们可以缓存对象,在下次请求时返回该对象的一个副本,并更新数据库从而减少数据库的调用。
译注:
1.关于原型模式为何会提高性能?
2.关于Java的深拷贝和浅拷贝。
引用来自脚本之家、CSDN博客
实现原型模式
深拷贝与浅拷贝
我们将创建一个抽象的Shape类和继承这个抽象类的子类Shape。接下来声明一个类ShapeCache,该类把Shape对象在存储在HashTable中,当被请求时返回它们的副本。
PrototypPatternDemo,我们的democlass将使用ShapeCache类来获得Shape对象。
创建一个抽象类Shape实现Cloneable接口。
Shape.java
public abstract class Shape implements Cloneable {
private String id;
protected String type;
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;
}
}
第二步
创建具体类继承Shape类。
Rectangle.java
public class Rectangle extends Shape {
public Rectangle(){
type = "Rectangle";
}
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
public class Square extends Shape {
public Square(){
type = "Square";
}
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
public class Circle extends Shape {
public Circle(){
type = "Circle";
}
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
第三步
创建一个类从数据库中得到具体类,并且把它们存储在一个HashTable中。
ShapeCache.java
import java.util.Hashtable;
public class ShapeCache {
private static Hashtable shapeMap = new Hashtable();
public static Shape getShape(String shapeId) {
Shape cachedShape = shapeMap.get(shapeId);
return (Shape) cachedShape.clone();
}
// for each shape run database query and create shape
// shapeMap.put(shapeKey, shape);
// for example, we are adding three shapes
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);
}
}
第四步
PrototypePatternDemo 使用 ShapeCache 类从HashTable中获得诸多图形的克隆副本。
PrototypePatternDemo.java
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());
}
}
第五步
校验输出
Shape : Circle Shape : Square Shape : Rectangle
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65707.html
摘要:调用者对象会寻找合适的并且能够处理该命令的对象,然后把该命令传递给相应的对象处理。紧接着创建一个类代表请求。创建具体的命令类和实现接口,它们将会作为具体的命令被处理。代表调用者,它能获得并且发出命令。 原文连接译者 smallclover希望对大家有所帮助。谢谢!(●◡●) 设计模式-命令模式 命令模式是一种数据驱动的设计模式,属于行为型模式这一类。命令模式会将一个请求包装成一个对象并...
摘要:在代理模式中,我们将创建一个对象,该对象在在接口中持有原始对象,以对外部提供它的功能。实现我们将创建一个接口并且创建具体类实现接口。 原文链接译者:smallclover希望对你们有所帮助,谢谢阅读! 设计模式-代理模式 在代理模式中,我们使用一个类来代表另一个类的功能。这种类型的设计模式属于结构型设计模式的一种。在代理模式中,我们将创建一个对象,该对象在在接口中持有原始对象,以对外部...
摘要:实现我们将创建一个接口,并且创建具体的类实现它。接下来我们需要声明一个门面类。,我们的类将通过使用类来展示这些结果。 原文链接译者:smallclover希望对大家有所帮助!Thanks for your watching 门面模式 门面模式隐藏系统的复杂性同时会提供一个接口给用户,使得用户可以使用该系统。这种类型的设计模式属于结构型模式的一种,它将会添加一个接口到现有的系统当中,用户...
摘要:迭代器模式属于行为型模式下的一种。实现我们将创建一个接口,该接口描述迭代所需要的方法紧接着声明了一个接口,该接口返回一个对象。我们会创建具体的类实现接口和接口,并去使用它们。第三步使用获得迭代器并且打印。 原文地址译者 smallclover希望对你们有所帮助 设计模式-迭代器模式 迭代器是Java和.Net程序环境下经常使用的一种设计模式。这种设计模式通常用来获取能顺序访问集合对元素...
摘要:然后在创建一个抽象的类,该类也实现了接口,并且持有一个类的对象。第四步创建具体的装饰器类,该类继承了类。第五步使用装饰对象。 原文链接译者:smallclover个人翻译,因为英语水平的原因可能会词不达意,十分欢迎各位读者指出其中的错误,希望能对读者有1%的用处,谢谢! 设计模式-装饰器模式 装饰器模式允许使用者将新功能添加到现有的对象而不需要改变它的数据结构。这种类型的设计模式来源于...
阅读 3502·2023-04-25 20:43
阅读 1974·2021-09-30 09:54
阅读 1870·2021-09-24 09:47
阅读 3134·2021-09-06 15:02
阅读 3787·2021-02-22 17:09
阅读 1495·2019-08-30 15:53
阅读 1663·2019-08-29 17:04
阅读 2210·2019-08-28 18:22