منبع اصلی نوشتار زیر در این لینک قرار دارد

الگوی طراحی Factory در جاوا

به مطلب آموزشی الگوی طراحی Factory در جاوا خوش آمدید. الگوی طراحی Factory یکی از الگوهای دسته Creational Design pattern است و به طور عمده ای در JDK و همچنین فریمورک هایی مانند Spring و Struts استفاده شده است.

الگوی طراحی Factory چیست؟

ما قبلاً الگوی طراحی Proxy را بررسی کرده ایم که آن از دسته الگوهای Structural بود و اما الگوی Factory از دسته الگوهای Creational است. اما چگونه این الگو به تولید در مبحث شئ گرایی ربط پیدا می کند؟

الگوی طراحی Factory زمانی استفاده می شود که ما یک کلاس والد دارید که با ارث بری از آن تعدادی زیرکلاس ایجاد کرده ایم، و بر اساس ورودی می خواهیم یکی از شئ متناسب با یکی از زیرکلاس ها را تولید کنیم و برگردانیم.

در واقع این الگو مسئول نمونه سازی از یک کلاس است که نوع آن کلاس را برنامه مشتری و ورودی آن مشخص می کند.

بیایید ابتدا نحوه پیاده سازی الگوی Factory در جاوا را ببینیم و یاد بگیریم و بعد در مورد مزایای الگوی طراحی Factory صحبت کنیم.

 

پیاده سازی الگوی طراحی Factory

کلاس های متفاوتی برای پیاده سازی مثال نیاز داریم که به ترتیب می سازیم. اول از همه به سراغ کلاس اصلی که کلاس والد است می رویم.

الگوی طراحی Factory – کلاس والد

کلاس والد یا Parent class یا  Super class ، می تواند هر نوع کلاسی باشد، چه interface چه abstract class و چه یک کلاس عادی جاوا.

برای مثالی که ما در اینجا ارائه می دهیم، یک کلاس والد abstract که تابع

toString()
آن اصطلاحاً Override شده است، تعریف شده است.

package example.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();
	}
}

 

الگوی طراحی Factory – زیرکلاس های ارث بری شده

بیایید فرض کنیم ما دو زیرکلاس PC و Server را هم داریم از کلاس والد Computer ارث برده اند.

کلاس PC :

package example.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;
	}

}

 

و کلاس Server :

package example.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;
	}

}

 

الگوی طراحی Factory – کلاس Factory

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

package example.design.model;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;
import com.journaldev.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;
	}
}

دو نکته مهم درباره کلاس الگوی طراحی Factory را باید بدانید:

  1. می توانیم کلاس Factory را به صورت Singleton تعریف کنیم؛ و یا متدی که شئ زیرکلاس را بر می گرداند static باشد.
  2. بر اساس ورودی اشیا متفاوتی می تواند ساخته و برگردانده شود. به همین دلیل نوع مقدار خروجی از کلاس والد یا همان Computer تعریف شده است. متد
    getComputer
    در واقع همان متد تولید کننده factory است.

 

الگوی طراحی Factory – برنامه کاربردی برای تست

این یک برنامه ساده است که به عنوان برنامه سمت مشتری از الگوی طراحی شده در بالا استفاده می کند.

package example.design.model;

import com.journaldev.design.factory.ComputerFactory;
import com.journaldev.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

 

جمع بندی

نمونه های الگوی طراحی Factory در JDK

  1. متد
    getInstance
    در java.util.Calendar, ResourceBundle و NumberFormat از الگوی Factory استفاده می کنند.
  2. متد
    valueOf
    در کلاس های پوششی مانند Boolean و Integer و … .

 

مزایای الگوی طراحی Factory

  1. این الگوی طراحی می توان روشی ارائه می دهد تا به سادگی برای همه چیز interface طراحی کنید و محدود به پیاده سازی همه چیز از ابتدا نیستید.
  2. این الگوی طراحی با حذف نمونه سازی مستقیم از کلاس های اصلی، واسطی ارائه می دهد تا نمونه سازی از طریق آن انجام شود. به این شکل، کد ما پیچیدگی کمتری دارد و کدها در مقابل خطاهای پیاده سازی مقاومت و استحکام بیشتری دارند.
  3. الگوی Factory انتزاع خوبی را بین پیاده سازی کلاس های اصلی و کلاس برنامه کاربردی یا همان برنامه مشتری ارائه می دهد. به این ترتیب بدون نیاز به تغییر کلاس های برنامه مشتری، می توان تعریف کلاس های PC و Server را تغییر داد.

 

 

منبع انتشار این آموزش، مطلبی با عنوان Factory Design Pattern in Java بوده است.

نوشته الگوی طراحی Factory در جاوا اولین بار در اوپن مایند. پدیدار شد.



برچسب ها :