| title | Factory | |
|---|---|---|
| shortTitle | Factory | |
| category | Creational | |
| language | ar | |
| tag |
|
- المصنع البسيط
- طريقة المصنع الثابتة
توفير طريقة ثابتة محاطة في فئة تسمى المصنع (Factory)، لإخفاء منطق التنفيذ وجعل شفرة العميل تركز على الاستخدام بدلاً من تهيئة الكائنات الجديدة.
مثال من الحياة الواقعية
تخيل كيميائيًا على وشك تصنيع العملات. يجب أن يكون الكيميائي قادرًا على إنشاء عملات ذهبية وكذلك عملات نحاسية، ويجب أن يكون من الممكن التبديل بينهما دون تعديل الكود المصدري الحالي. يجعل نمط المصنع هذا ممكنًا من خلال توفير طريقة بناء ثابتة يمكن استدعاؤها مع المعلمات ذات الصلة.
تقول ويكيبيديا
المصنع (Factory) هو كائن لإنشاء كائنات أخرى: بشكل رسمي، المصنع هو دالة أو طريقة تُرجع كائنات من نموذج أو فئة متغيرة.
مثال برمجي
لدينا واجهة عملة Coin واثنان من تطبيقات العملة: عملة ذهبية GoldCoin وعملة نحاسية CopperCoin.
public interface Coin {
String getDescription();
}
public class GoldCoin implements Coin {
static final String DESCRIPTION = "This is a gold coin.";
@Override
public String getDescription() {
return DESCRIPTION;
}
}
public class CopperCoin implements Coin {
static final String DESCRIPTION = "This is a copper coin.";
@Override
public String getDescription() {
return DESCRIPTION;
}
}تُمثل التعداد التالي أنواع العملات التي نقبلها (GoldCoin و CopperCoin).
@RequiredArgsConstructor
@Getter
public enum CoinType {
COPPER(CopperCoin::new),
GOLD(GoldCoin::new);
private final Supplier<Coin> constructor;
}ثم لدينا الطريقة الثابتة للحصول على العملة getCoin لإنشاء كائنات العملة مغلفة داخل فئة المصنع CoinFactory.
public class CoinFactory {
public static Coin getCoin(CoinType type) {
return type.getConstructor().get();
}
}الآن في كود العميل يمكننا إنشاء أنواع مختلفة من العملات باستخدام فئة المصنع.
LOGGER.info("The alchemist begins his work.");
var coin1 = CoinFactory.getCoin(CoinType.COPPER);
var coin2 = CoinFactory.getCoin(CoinType.GOLD);
LOGGER.info(coin1.getDescription());
LOGGER.info(coin2.getDescription());The alchemist begins his work.
This is a copper coin.
This is a gold coin.استخدم نمط المصنع (Factory) عندما يكون تركيزك على إنشاء الكائنات فقط دون القلق حول كيفية إنشائها وإدارتها.
- يسمح بجمع كل عمليات إنشاء الكائنات في مكان واحد وتجنب نشر الكلمة الأساسية 'new' عبر قاعدة الشيفرة.
- يُمكنك من كتابة شيفرة منخفضة الارتباط. من بين مزاياه الرئيسية: قابلية أفضل للاختبار، شيفرة سهلة الفهم، مكونات قابلة للاستبدال، قابلية التوسع، وميزات معزولة.
- قد يصبح الشيفرة أكثر تعقيدًا مما ينبغي.
- java.util.Calendar#getInstance()
- java.util.ResourceBundle#getBundle()
- java.text.NumberFormat#getInstance()
- java.nio.charset.Charset#forName()
- java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (يعيد كائنات Singleton مختلفة استنادًا إلى بروتوكول معين)
- java.util.EnumSet#of()
- javax.xml.bind.JAXBContext#createMarshaller() وأيضًا طرق مشابهة أخرى.
