JavaRush /وبلاگ جاوا /Random-FA /کافه استراحت شماره 124. الگوی طراحی سازنده نحوه کار سریال...

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

در گروه منتشر شد

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

منبع: Medium در این مقاله با نحوه طراحی و ایجاد اشیاء برای یک کلاس با استفاده از الگوی طراحی Builder آشنا خواهیم شد . کافه استراحت شماره 124.  الگوی طراحی سازنده  نحوه کار سریال سازی و سریال زدایی در جاوا - 1

چرا به الگوی طراحی بیلدر نیاز داریم؟

الگوی Builder برای ایجاد اشیا با استفاده از یک کلاس استاتیک عمومی تودرتو طراحی شده است که دارای فیلدهای داده مشابه با کلاس خارجی است. الگوی Builder برای حل مشکلاتی ایجاد شد که در الگوهای طراحی Factory و Abstract Factory وجود داشت ، زمانی که یک شی کلاس حاوی مقادیر فیلد و/یا داده های زیادی باشد. قبل از اینکه به الگوی سازنده بپردازیم ، بیایید دقیقاً ببینیم که چه مشکلاتی با الگوهای Factory و Abstract Factory برای سناریوهایی که یک شی دارای مقادیر فیلدهای زیادی است، به وجود می آید:
  1. داشتن آرگومان های بیش از حد برای انتقال از برنامه مشتری به کلاس Factory می تواند باعث ایجاد خطا شود زیرا در اکثر مواقع نوع آرگومان یکسان است و حفظ ترتیب آرگومان ها در سمت کلاینت دشوار است.

  2. برخی از پارامترها ممکن است اختیاری باشند، اما در الگوی Factory ما مجبور به ارسال همه پارامترها هستیم و پارامترهای اختیاری باید به صورت فایل NULL ارسال شوند .

  3. اگر شی "سنگین" و با طراحی پیچیده باشد، تمام این مشکلات بخشی از کلاس های Factory خواهد شد که اغلب منجر به سردرگمی می شود.

مشکلات فوق زمانی قابل حل هستند که جسم دارای تعداد زیادی پارامتر باشد. برای انجام این کار، شما فقط باید پارامترهای مورد نیاز را در اختیار سازنده قرار دهید و سپس روش های مختلف تنظیم کننده برای تنظیم پارامترهای اختیاری. توجه داشته باشید که مشکل این روش این است که وضعیت شی ناسازگار باقی می ماند مگر اینکه همه ویژگی ها به وضوح تنظیم شوند.

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

الگوی Builder با ارائه راهی برای ساختن یک شی گام به گام، مشکل داشتن تعداد زیادی پارامتر اختیاری و حالت های ناسازگار را حل می کند. این از روشی استفاده می کند که در واقع شی نهایی را برمی گرداند.

چگونه الگوی طراحی بیلدر را در جاوا پیاده سازی کنیم؟

اگر مراحل زیر را دنبال کنیم، روند گام به گام ایجاد یک شی و بازیابی آن را دریافت می کنیم:
  1. یک کلاس تودرتو ثابت به عنوان کلاس Builder ایجاد کنید و سپس تمام فیلدها را از کلاس خارجی به کلاس Builder کپی کنید . ما باید از یک قرارداد نامگذاری پیروی کنیم، بنابراین اگر نام کلاس Person باشد ، کلاس Builder باید PersonBuilder نامیده شود .

  2. کلاس Builder باید یک سازنده عمومی با تمام فیلدهای مورد نیاز به عنوان پارامتر داشته باشد.

  3. کلاس Builder باید متدهایی برای تنظیم پارامترهای اختیاری داشته باشد و پس از تنظیم فیلد اختیاری باید همان شی Builder را برگرداند.

  4. آخرین مرحله ارائه یک متد build() در کلاس Builder است که شی مورد نیاز برنامه کلاینت را برمی گرداند. برای این کار باید یک سازنده خصوصی در کلاس اصلی با کلاس 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();
    }
}
الگوی Builder مثال : java.lang.StringBuilder و java.lang.StringBuffer از الگوی Builder برای ساخت اشیا استفاده کردند .

نحوه کار سریال سازی و سریال زدایی در جاوا

منبع: Medium من در ژانویه امسال پس از یک دوره کارآموزی به جاوا تغییر مکان دادم. قبل از این بیشتر با PHP و کمی جاوا اسکریپت می نوشتم. من قبلاً با سریال سازی مواجه نشده بودم، اگرچه سریال سازی در واقع در PHP وجود دارد. درست است، در جاوا بیشتر از آن استفاده می شود. امروز شما را با نحوه کار سریال سازی و سریال زدایی در جاوا و چندین روش استفاده از آنها آشنا می کنم.

سریال سازی و سریال زدایی چیست

سریال سازی تبدیل یک شی از یک کلاس به دنباله ای از بایت ها در ماشین مجازی جاوا (JVM) برای انتقال به ماشین مجازی جاوا دیگر است. اگر ماشین مجازی جاوا یک شی را از بایت ها بازآفرینی کند، این فرآیند را deserialization می گویند.

نمونه ای از سریال سازی و سریال زدایی

سریال سازی

بیایید یک کلاس ایجاد کنیم که شیء آن سریال شود:
import java.io.*;

public class Person implements Serializable{

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

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
کلاس Person Serializable را پیاده‌سازی می‌کند تا شیء آن بتواند سریال‌سازی/عدم سریال‌سازی شود. کلاس Person دو فیلد دارد: شناسه و نام که با ایجاد نمونه ای از کلاس، از مقدار پیش فرض تغییر می کند. رابط Serializable و سایر کلاس های مورد استفاده در برنامه به بسته 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 استفاده کنید . توجه داشته باشید که برای دسترسی به فیلدهای کلاس Person ، شی به نوع داده Person فرستاده می شود . یک شی کلاس که رابط سریال سازی را پیاده سازی نمی کند، نمی تواند سریال سازی شود. بنابراین، هر کلاسی که به کلاسی ارجاع می‌دهد که رابط سریال‌سازی را پیاده‌سازی می‌کند، باید خودش رابط سریال‌سازی را پیاده‌سازی کند، در غیر این صورت یک استثنا ایجاد می‌شود. سریال‌سازی مستقل از پلتفرم است، به این معنی که جریان بایتی که سریال‌سازی می‌شود می‌تواند توسط یک ماشین مجازی جاوا دیگر سریال‌سازی شود. فیلدهای استاتیک و گذرا قابل سریال‌سازی نیستند، بنابراین اگر فیلدی دارید که نمی‌خواهید سریال‌سازی کنید، آن را موقت یا ثابت کنید. در مورد یک فیلد ثابت، سریالی نمی شود زیرا یک فیلد ایستا متعلق به یک کلاس است و نه یک شی. به همین دلیل، حالت گذار از سریال شدن فیلد جلوگیری می کند. سریال سازی در Hibernate، JPA و RMI استفاده می شود. سریال سازی را نیز می توان سفارشی کرد. به این سریال سازی سفارشی می گویند.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION