تبلیغات

الگوی طراحی فکتوری (Factory) در جاوا

الگوی طراحی فکتوری (Factory) در جاوا
Singleton

الگوی طراحی فکتوری (Factory = کارخانه)، زمانی استفاده می‌شود که ما یک کلاس پدر با چندین کلاس فرزند داشته باشیم و براساس ورودی، یکی از کلاس‌های فرزند را بارگزاری کنیم. این الگو، مسئولیت نمونه‌گیری (ایجاد نمونه = Instantiation) از یک کلاس را، از خود کدهای اصلی برنامه، به داخل کلاس فکتوری (Factory Class) منتقل می‌کند.

این الگوی طراحی، به Factory Method Design Pattern نیز معروف است.

الگوی طراحی فکتوری در جاوا

این الگو، به طور گسترده‌ای در JDK جاوا استفاده شده است. ابتدا اجازه دهید تا با نحوه‌ی ‌پیاده‌سازی این الگوی طراحی در جاوا آشنا شویم؛ و سپس مزایای استفاده از آن را خواهیم گفت. همچنین به برخی موارد استفاده شده از این الگو در JDK نیز نگاهی خواهیم انداخت.

Super Class/کلاس پدر

Super Class یا کلاس پدر، در الگوی طراحی فکتوری، می‌تواند یک رابط (اینترفیس = Interface)، کلاس انتزاعی (abstract class) و یا یک کلاس عادی جاوا باشد. برای مثال، ما یک کلاس انتزاعی خواهیم داشت که در آن، متد toString نیز اووراید شده است.

package com.fullkade.design.model;

public abstract class Computer {
	
	public abstract String getRAM();
	public abstract String getHDD();
	public abstract String getCPU();
	
	@Override
	public String toString(){
		return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
	}
}

Sub Classes/کلاس‌های فرزند

فرض کنید ما دو کلاس فرزند به نام‌های PC و Server داریم؛ که به صورت زیر پیاده‌سازی شده‌اند:

package com.fullkade.design.model;

public class PC extends Computer {

	private String ram;
	private String hdd;
	private String cpu;
	
	public PC(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}

	@Override
	public String getRAM() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}

}
package com.fullkade.design.model;

public class Server extends Computer {

	private String ram;
	private String hdd;
	private String cpu;
	
	public Server(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	@Override
	public String getRAM() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}

}
توجه داشته باشید که هردوی این کلاس‌ها، از کلاس پدر که در اینجا Cmputer است، مشتق شده‌اند.

Factory Class

حالا که کلاس پدر و فرزندان آن را داریم، می‌توانیم کلاس فکتوری خود را پیاده کنیم. یک پیاده‌سازی ابتدایی از آن را در زیر می‌بینید:

package com.fullkade.design.factory;

import com.fullkade.design.model.Computer;
import com.fullkade.design.model.PC;
import com.fullkade.design.model.Server;

public class ComputerFactory {

	public static Computer getComputer(String type, String ram, String hdd, String cpu){
		if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
		else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
		
		return null;
	}
}

برخی از نکات مهم درباره‌ی الگوی طراحی کارخانه عبارتند از:

  • ما می‌توانیم کلاس فکتوری را به صورت سینگلتون نگهداری کنیم؛ و یا می‌توانیم متدی که کلاس‌های فرزند را برمیگرداند، به صورت static تعریف کنیم (همانند بالا).
  • توجه داشته باشید که براساس پارامتر ورودی، کلاس‌های متفاوتی ممکن است ایجاد و برگردانده شوند. و getComputer، متد کارخانه است.


حالا در زیر، یک مثال ساده‌ای از نحوه‌ی استفاده از الگوی طراحی فکتوری بالا را پیاده‌سازی کرده‌ایم:

package com.fullkade.design.test;

import com.fullkade.design.factory.ComputerFactory;
import com.fullkade.design.model.Computer;

public class TestFactory {

	public static void main(String[] args) {
		Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
		Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
		System.out.println("Factory PC Config::"+pc);
		System.out.println("Factory Server Config::"+server);
	}

}

خروجی این کد به صورت زیر خواهد بود:

Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

مثال‌های فکتوری در JDK

  • کلاس java.util.Calendar و ResourceBundle و متدهای NumberFormat getInstance()،
  • متد valueOf()، در کلاس‌های wrapper مثل Boolean، Integer و …

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک‌گذاری اطلاعات در هر زمینه‌ای که امکانش باشه 🙃

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه

توضیحات پیشنهادی نظرات اشتراک