نمط تصميم البناء في جافا

المصدر: Medium في هذه المقالة، سنتعلم كيفية تصميم وإنشاء كائنات لفئة باستخدام نمط تصميم Builder . استراحة القهوة رقم 124.  نمط تصميم البناء.  كيف يعمل التسلسل وإلغاء التسلسل في Java - 1

لماذا نحتاج إلى نمط تصميم البناء؟

تم تصميم نمط الباني لإنشاء كائنات باستخدام فئة ثابتة عامة متداخلة لها نفس حقول البيانات مثل الفئة الخارجية. تم إنشاء نمط Builder لحل المشكلات التي كانت موجودة في أنماط تصميم Factory و Abstract Factory عندما يحتوي كائن فئة على العديد من قيم الحقول و/أو البيانات. قبل أن ننتقل إلى نمط Builder ، دعونا نلقي نظرة على المشاكل التي تنشأ بالضبط مع أنماط Factory و Abstract Factory للسيناريوهات التي يكون فيها الكائن يحتوي على العديد من قيم الحقول:
  1. قد يؤدي وجود عدد كبير جدًا من الوسائط للتمرير من برنامج العميل إلى فئة Factory إلى حدوث أخطاء لأن نوع الوسيطة هو نفسه في معظم الأوقات ومن الصعب على جانب العميل الحفاظ على ترتيب الوسائط.

  2. قد تكون بعض المعلمات اختيارية، ولكن في نمط المصنع نحن مجبرون على إرسال جميع المعلمات، ويجب إرسال المعلمات الاختيارية كملفات NULL .

  3. إذا كان الكائن "ثقيلًا" وذو تصميم معقد، فستصبح كل هذه الصعوبات جزءًا من فئات المصنع، الأمر الذي يؤدي غالبًا إلى الارتباك.

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

ما هو نمط تصميم البناء؟

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

كيفية تنفيذ نمط تصميم Builder في Java؟

إذا اتبعنا الخطوات أدناه، فسنحصل على عملية خطوة بخطوة لإنشاء كائن واسترجاعه:
  1. قم بإنشاء فئة متداخلة ثابتة كفئة منشئ ، ثم قم بنسخ كافة الحقول من الفئة الخارجية إلى فئة منشئ . علينا أن نتبع اصطلاح التسمية، لذلك إذا كان اسم الفئة هو Person ، فيجب تسمية فئة Builder باسم PersonBuilder .

  2. يجب أن تحتوي فئة Builder على مُنشئ عام بجميع الحقول المطلوبة كمعلمات.

  3. يجب أن تحتوي فئة المنشئ على طرق لتعيين المعلمات الاختيارية، ويجب أن تقوم بإرجاع نفس كائن المنشئ بعد تعيين الحقل الاختياري.

  4. الخطوة الأخيرة هي توفير طريقة build() في فئة Builder ، والتي ستعيد الكائن الذي يحتاجه برنامج العميل. للقيام بذلك، نحتاج إلى مُنشئ خاص في الفئة الرئيسية مع فئة Builder كوسيطة.

مثال:

دعونا نلقي نظرة على مثال للحصول على فهم واضح لنمط تصميم المنشئ .
public class Employee {

    private String name;
    private String company;
    private boolean hasCar;//optional
    private boolean hasBike;//optional

    private Employee(EmployeeBuilder employeeBuilder) {
        name = employeeBuilder.name;
        company = employeeBuilder.company;
        hasCar = employeeBuilder.hasCar;
        hasBike = employeeBuilder.hasBike;
    }

    public String getName() {
        return name;
    }

    public String getCompany() {
        return company;
    }

    public boolean isHasCar() {
        return hasCar;
    }

    public boolean isHasBike() {
        return hasBike;
    }

    public static class EmployeeBuilder {
        private String name;
        private String company;
        private boolean hasCar;//optional
        private boolean hasBike;//optional

        //constructor for required fields
        public EmployeeBuilder(String name, String company) {
            this.name = name;
            this.company = company;
        }

        //setter methods for optional fields
        public EmployeeBuilder setHasCar(boolean hasCar) {
            this.hasCar = hasCar;
            return this;
        }

        public EmployeeBuilder setHasBike(boolean hasBike) {
            this.hasBike = hasBike;
            return this;
        }

        //Build the Employee object
        public Employee build() {
            return new Employee(this);
        }
    }
}

class TestBuilder {
    public static void main(String[] args) {
        //Building the object of Employee thru the build() method provided in EmployeeBuilder class.
        Employee employee = new Employee.EmployeeBuilder("Vikram", "ABC").setHasBike(false).setHasBike(true).build();
    }
}
مثال لنمط المنشئ : استخدم java.lang.StringBuilder و java.lang.StringBuffer نمط المنشئ لبناء الكائنات.

كيف يعمل التسلسل وإلغاء التسلسل في جافا

المصدر: Medium لقد تحولت إلى Java في يناير من هذا العام بعد فترة تدريب. قبل ذلك، كنت أكتب في الغالب بلغة PHP والقليل من JavaScript. لم يسبق لي أن واجهت التسلسل من قبل، على الرغم من أن التسلسل موجود بالفعل في PHP. صحيح أنه يتم استخدامه في Java في كثير من الأحيان. سأقدم لك اليوم كيفية عمل التسلسل وإلغاء التسلسل في Java وعدة طرق لاستخدامهما.

ما هو التسلسل وإلغاء التسلسل

التسلسل هو تحويل كائن من فئة إلى سلسلة من البايتات في Java Virtual Machine (JVM) لنقله إلى Java Virtual Machine آخر. إذا قام Java Virtual Machine بإعادة إنشاء كائن من البايتات، فإن العملية تسمى إلغاء التسلسل.

مثال على التسلسل وإلغاء التسلسل

التسلسل

لنقم بإنشاء فئة سيتم إجراء تسلسل لكائنها:
import java.io.*;

public class Person implements Serializable{

int id = 0;
String name = "empty";

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
تطبق فئة الشخص إمكانية إجراء تسلسل بحيث يمكن إجراء تسلسل/إلغاء تسلسل كائنها. تحتوي فئة الشخص على حقلين: المعرف والاسم، اللذين يتغيران من القيمة الافتراضية عند إنشاء مثيل للفئة. تم استيراد الواجهة القابلة للتسلسل والفئات الأخرى المستخدمة في البرنامج إلى حزمة Java.io.
public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// serialization
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));

try {

out.writeObject(person);
System.out.println("Success");
} catch(Exception e) {

System.out.println("Unsuccessful");
} finally {

if(out != null) {

out.close();
}
}
}
كما تعلم، فإن الطريقة الرئيسية تبدأ عملية التسلسل وتطبع رسالة نجاح، وإلا فسيتم طباعة رسالة خطأ. لإجراء تسلسل للكائنات نستخدم ObjectOutputStream وطريقة writeObject .

إلغاء التسلسل

public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// Deserialization
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));

try {

Person personObj = (Person)in.readObject();
System.out.println("Person Id is " +personObj.id + " while name is " + personObj.name);
} catch (Exception e) {

e.printStackTrace();
} finally {

if(in != null) {

in.close();
}
}
}
إلغاء التسلسل هو عكس التسلسل. لإعادة بناء كائن من سلسلة من البايتات، استخدم ObjectInputStream والأسلوب readObject . لاحظ أنه لتوفير الوصول إلى الحقول الموجودة في فئة "الشخص" ، يتم تحويل الكائن إلى نوع بيانات "الشخص" . لا يمكن إجراء تسلسل لكائن فئة لا يطبق واجهة التسلسل. لذلك، أي فئة تشير إلى فئة تطبق واجهة تسلسل، يجب أن تقوم بنفسها بتنفيذ واجهة التسلسل، وإلا سيتم طرح استثناء. التسلسل مستقل عن النظام الأساسي، مما يعني أن دفق البايت الذي يتم تسلسله يمكن إلغاء تسلسله بواسطة جهاز Java Virtual Machine آخر. الحقول الثابتة والعابرة غير قابلة للتسلسل، لذلك إذا كان لديك حقل لا تريد إجراء تسلسل له، فاجعله مؤقتًا أو ثابتًا. في حالة وجود حقل ثابت، لا يتم إجراء تسلسل له لأن الحقل الثابت ينتمي إلى فئة وليس إلى كائن. وبسبب هذا، تمنع حالة الانتقال الحقل من إجراء تسلسل. يتم استخدام التسلسل في السبات، JPA وRMI. يمكن أيضًا تخصيص التسلسل. وهذا ما يسمى التسلسل المخصص.