نمط تصميم المصنع الزجاجي في لغة الجافا

مرحبًا بكم في مثال عن نمط تصميم الواجهة الخالصة في جافا. نمط تصميم الواجهة الخالصة هو واحد من الأنماط الخالقة. يكاد نمط تصميم الواجهة الخالصة يكون مشابهًا تمامًا لنمط الـالمصنع باستثناء حقيقة أنه يشبه المصنع للمصانع أكثر.

الواجهة الخالصة

إذا كنت تعرف نمط تصميم المصنع في جافا, ستلاحظ أن لدينا فئة واحدة للمصنع. تعيد هذه الفئة المصنوعات الفرعية المختلفة بناءً على المدخلات المقدمة، وتستخدم الفئة المصنعية تعبير if-else أو switch لتحقيق ذلك. في نمط الواجهة الخالصة، نتخلص من كتلة if-else ونملك فئة مصنع لكل فئة فرعية. ثم توجد فئة واجهة خالصة ستقوم بإعادة الفئة الفرعية بناءً على فئة المصنع المقدمة كمدخل. في البداية، يبدو الأمر مربكًا ولكن بمجرد رؤية التنفيذ، من السهل حقًا فهم الفارق الطفيف بين نمط المصنع ونمط الواجهة الخالصة. كما في مقالنا حول نمط المصنع، سنستخدم نفس الفئة الأب والفئات الفرعية.

نمط تصميم المصنع المجرّد للفئة الأم والفئات الفرعية

Computer.java

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

PC.java

package com.journaldev.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.java

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

فئة المصنع لكل فئة فرعية

أولاً نحتاج إلى إنشاء واجهة مصنع مجرّدة أو فئة مجرّدة. ComputerAbstractFactory.java

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;

public interface ComputerAbstractFactory {

	public Computer createComputer();

}

لاحظ أن طريقة createComputer() تُرجع مثيلًا من الفئة الأم Computer. الآن ستقوم فئات المصنع بتنفيذ هذه الواجهة وإرجاع فئتها الفرعية. PCFactory.java

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;

public class PCFactory implements ComputerAbstractFactory {

	private String ram;
	private String hdd;
	private String cpu;
	
	public PCFactory(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	@Override
	public Computer createComputer() {
		return new PC(ram,hdd,cpu);
	}

}

بالمثل سنمتلك فئة مصنع لفئة Server الفرعية. ServerFactory.java

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.Server;

public class ServerFactory implements ComputerAbstractFactory {

	private String ram;
	private String hdd;
	private String cpu;
	
	public ServerFactory(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	
	@Override
	public Computer createComputer() {
		return new Server(ram,hdd,cpu);
	}

}

الآن سنقوم بإنشاء فئة مستهلك ستوفر نقطة الدخول لفئات العميل لإنشاء الفئات الفرعية. ComputerFactory.java

package com.journaldev.design.abstractfactory;

import com.journaldev.design.model.Computer;

public class ComputerFactory {

	public static Computer getComputer(ComputerAbstractFactory factory){
		return factory.createComputer();
	}
}

يرجى ملاحظة أنها فئة بسيطة وأن طريقة `getComputer` تقبل وسيطًا من نوع `ComputerAbstractFactory` وتعيد كائنًا من نوع `Computer`. في هذه النقطة، يجب أن يكون التنفيذ واضحًا. دعونا نكتب طريقة اختبار بسيطة ونرى كيفية استخدام المصنع الفني للحصول على مثيل من الفئات الفرعية. `TestDesignPatterns.java`

package com.journaldev.design.test;

import com.journaldev.design.abstractfactory.PCFactory;
import com.journaldev.design.abstractfactory.ServerFactory;
import com.journaldev.design.factory.ComputerFactory;
import com.journaldev.design.model.Computer;

public class TestDesignPatterns {

	public static void main(String[] args) {
		testAbstractFactory();
	}

	private static void testAbstractFactory() {
		Computer pc = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));
		Computer server = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));
		System.out.println("AbstractFactory PC Config::"+pc);
		System.out.println("AbstractFactory Server Config::"+server);
	}
}

سيكون إخراج البرنامج أعلاه:

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

إليك رسم توضيحي لفئة نمط تصميم المصنع الفني.

فوائد نمط تصميم المصنع الفني

  • يوفر نمط تصميم المصنع الفني نهجًا للترميز لواجهة بدلاً من التنفيذ.
  • نمط المصنع الفني هو “مصنع للمصانع” ويمكن توسيعه بسهولة لاستيعاب المزيد من المنتجات، على سبيل المثال يمكننا إضافة فئة فرعية أخرى مثل الكمبيوتر المحمول ومصنع الكمبيوتر المحمول.
  • نمط المصنع الفني قوي ويتجنب المنطق الشرطي لنمط المصنع.

أمثلة على نمط تصميم المصنع المجرد في JDK

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()

درس فيديو تعليمي عن نمط تصميم المصنع المجرد

I recently uploaded a video on YouTube for abstract factory design pattern. In the video, I discuss when and how to implement an abstract factory pattern. I have also discussed what is the difference between the factory pattern and abstract factory design pattern. https://youtu.be/BPkYkyVWOaw

يمكنك تحميل أمثلة الشيفرة من مشروعي على GitHub.

Source:
https://www.digitalocean.com/community/tutorials/abstract-factory-design-pattern-in-java