در این قسمت تیم کدگیت به آموزش Flyweight پترن در جاوا میپردازد. پیش نیاز این آموزش شامل موارد زیر است:
Structural Patterns
یکی از زیر شاخههای دیزاین پترن Structural Patterns است. Structural Patterns در مورد اشیا و کلاسها و چگونگی ترکیب آنها با یکدیگر صحبت میکند. برای مشخص کردن ارتباط اشیا و کلاسها با یکدیگر، این پترن ساختار سادهای را ایجاد میکند (البته بیشتر تمرکز این پترن بر روی شی گرایی است).
Flyweight پترن در جاوا
کاربرد و هدف اصلی Flyweight پترن، کاهش تعداد شیهای ساخته شده در کد است. به طور کلی کاری که این پترن انجام میدهد استفاده دوباره از شیهای که قبلا ساخته شده بوده و اگر شی خاصی وجود نداشت آن را میسازد. Flyweight پترن یکی از شاخههای Structural Pattern است.
کد Flyweight پترن در جاوا
یک Interface به نام Shape داریم که کلاس Circle از آن استفاده میکند. برای ساخت شی circle کلاسی به نام ShapeFactory ساختیم. در این کلاس ما یک HashMap استفاده کردیم و با هر بار در خواست ساخت شی Circle، بررسی میکنیم شی مورد نظر در HashMap وجود دارد یا خیر، در صورت وجود شی درخواست شده فقط متغیرهای آن را عوض میکنیم و در غیر این صورت یک شی جدید میسازیم. کد کلاسهای توضیح داده شده به صورت زیر میباشد:
public interface Shape {
void draw();
}
public class Circle implements Shape {
private String color;
private int x;
private int y;
private int radius;
public Circle(String color) {
this.color = color;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Circle: Draw() [Color : " + color + ", x : " + x
+ ", y :" + y + ", radius :" + radius);
}
}
import java.util.HashMap;
public class ShapeFactory {
private static final HashMap<String, Shape> circleMap = new HashMap();
public static Shape getCircle(String color) {
Circle circle = (Circle)circleMap.get(color);
if(circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
System.out.println("Creating circle of color : " + color);
}
return circle;
}
}
تست Flyweight پترن در جاوا
برای تست کدهای بالا، کد Main زیر را بزنید:
public class FlyweightPatternDemo {
private static final String colors[] = { "Red", "Green", "Blue", "White",
"Black" };
public static void main(String[] args) {
for (int i = 0; i < 20; ++i) {
Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
circle.setX(getRandomX());
circle.setY(getRandomY());
circle.setRadius(100);
circle.draw();
}
}
private static String getRandomColor() {
return colors[(int) (Math.random() * colors.length)];
}
private static int getRandomX() {
return (int) (Math.random() * 100);
}
private static int getRandomY() {
return (int) (Math.random() * 100);
}
}
کد بالا شی Circle را با استفاده از رنگ ایجاد میکند. حال با توجه به کلاس ShapeFactory اگر شی Circle درخواست داده شد که قبلا با آن رنگ موجود باشد به جای ساخت شی جدید فقط پارامتر های شی قبلی را با پارامترهای جدید عوض میکند.