أنماط التصميم في Java مع أمثلة: من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أنماط التصميم في Java: دليل شامل مع أمثلة



أنماط التصميم (design patterns) هي حلول مثبتة للمشكلات النمطية التي تظهر أثناء تطوير البرمجيات. في Java، كلغة موجهة للكائنات ومكتوبة بشكل صارم، تكون الأنماط فعالة بشكل خاص. فهي تساعد في جعل الكود مرنًا وقابلًا لإعادة الاستخدام وسهل الصيانة. في هذه المقالة، سنشرح المجموعات الثلاث الرئيسية للأنماط (حسب تصنيف GoF): الإنشائية والهيكلية والسلوكية مع أمثلة حقيقية بلغة Java.



1. الأنماط الإنشائية (Creational Patterns)

تدير هذه الأنماط عملية إنشاء الكائنات، مما يجعل النظام مستقلاً عن كيفية إنشاء الكائنات وتجميعها وتمثيلها.



1.1. Singleton (المفرد)

يضمن أن يكون للفئة مثيل واحد فقط، ويوفر نقطة وصول عالمية إليه. مثال كلاسيكي هو مجموعة اتصالات قاعدة البيانات أو المسجل (logger).

public class DatabaseConnection {    private static volatile DatabaseConnection instance;    private String connectionString;

private DatabaseConnection(String connectionString) { this.connectionString = connectionString; }

public static DatabaseConnection getInstance(String connectionString) { if (instance == null) { synchronized (DatabaseConnection.class) { if (instance == null) { instance = new DatabaseConnection(connectionString); } } } return instance; }

public void connect() { System.out.println("Connected to: " + connectionString); }}

// الاستخدامDatabaseConnection conn = DatabaseConnection.getInstance("jdbc:mysql://localhost:3306/mydb");conn.connect();


1.2. Factory Method (طريقة المصنع)

يحدد واجهة لإنشاء كائن، لكنه يسمح للفئات الفرعية بتغيير نوع الكائن الذي يتم إنشاؤه. مناسب تمامًا عندما يكون النوع الدقيق للكائن غير معروف مسبقًا.

interface Transport {    void deliver();}

class Truck implements Transport { public void deliver() { System.out.println("التوصيل بالشاحنة عبر البر"); }}

class Ship implements Transport { public void deliver() { System.out.println("التوصيل بالسفينة عبر البحر"); }}

abstract class Logistics { abstract Transport createTransport(); public void planDelivery() { Transport t = createTransport(); t.deliver(); }}

class RoadLogistics extends Logistics { Transport createTransport() { return new Truck(); }}

class SeaLogistics extends Logistics { Transport createTransport() { return new Ship(); }}

// الاستخدامLogistics logistics = new RoadLogistics();logistics.planDelivery(); // الإخراج: التوصيل بالشاحنة عبر البر


2. الأنماط الهيكلية (Structural Patterns)

تتولى تجميع الفئات والكائنات، مما يساعد في بناء هياكل معقدة من مكونات بسيطة.



2.1. Adapter (المهايئ)

يسمح للكائنات ذات الواجهات غير المتوافقة بالعمل معًا. يُستخدم غالبًا لدمج الكود القديم (legacy) مع الجديد.

// واجهة قديمةinterface OldSystem {    String getDataInXML();}

// واجهة جديدةinterface NewSystem { String getDataInJSON();}

// تنفيذ النظام القديمclass LegacySystem implements OldSystem { public String getDataInXML() { return "<data>Hello</data>"; }}

// المهايئclass XMLToJSONAdapter implements NewSystem { private OldSystem oldSystem; public XMLToJSONAdapter(OldSystem oldSystem) { this.oldSystem = oldSystem; } public String getDataInJSON() { String xml = oldSystem.getDataInXML(); return "{\\"data\\": \\"" + xml.replaceAll("<.*?>", "") + "\\"}"; }}

// و

المدونات

توصيات الكتب