حوزه: Object
هدف: Creational
نقش الگو
در زمانی که نیاز به شیهای مشابه باشد و ساخت هر شی منابع زیادی از سیستم را اشغال کند، این الگو طراحی میتوان گزینه مناسبی باشد تا یک کپی از شی مورد نظر برای ما ایجاد نماید. در واقع میتوان گفت مزیت الگوی طراحی Prototype سرعت بالاتر آن است بدلیل اینکه کپی کردن یک شئ از ایجاد یک نمونه جدید شئ سرعت بیشتری دارد.
طراحی الگوطراحی الگوی Prototype در قالب نمودار UML در شکل زیر نشان داده شده است.
پیاده سازی
یک کلاس پایه abstract ایجاد میکنیم که متد ()clone را تعریف میکند. هر کلاسی که از کلاسه پایه مشتق شود متد ()clone را پیادهسازی میکند.
هر زمان که نیاز به کپی از این کلاس بود به جای نوشتن new متد ()Clone فراخوانده میشود.
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;
}
}
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 {
private static Hashtable<String, Shape> shapeMap =
new Hashtable<String, Shape>();
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);
}
}
public class App {استفاده از الگو
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());
}
}
- زمانی که نیاز است از پایگاهدادهای حجیم، چندین تراکنش صورت گیرد تا پاسخ مسالهای پیدا شود. وقتی این پاسخ بدست آمد شاید بخواهید عملیاتی بر روی آنها انجام شود (بدون نیاز به انجام تراکنش جدید) در این حالت داشتن و یا تهیه یک نوع کپی از دادههای حاصل بسیار مطلوب است.
- اطلاعات شما در فایلی وجود دارد در هنگام ساخت نمونهای از کلاس، این اطلاعات از فایل خوانده شده (رکورد به رکورد) و داخل کلاس افزوده میشود. برای انجام هر عملیات ممکن است نیاز به نمونهای از این اطلاعات باشد و ساخت نمونهای جدید و لود کردن اطلاعات فایل، سربار زیادی ایجاد میکند.
مثال پیاده سازی شده با زبان جاوا را میتوانید از github من دانلود کنید.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.