Factory: η ουσία του προτύπου Factory Method και Abstract Factory

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-17 Χρόνος ανάγνωσης: 7 λεπ

Factory — ένα δημιουργικό πρότυπο που αναθέτει τη δημιουργία αντικειμένων σε εργοστασιακές μεθόδους. Στην κινητή ανάπτυξη, τα Factory Method και Abstract Factory χρησιμοποιούνται για τη δημιουργία ViewModel, NetworkClient, Repository και άλλων εξαρτήσεων. Factory απομονώνει τη λογική δημιουργίας στιγμιοτύπων, απλοποιώντας την αντικατάσταση υλοποιήσεων. Περισσότερα — στο Refactoring Guru: Factory Method.

Κύρια σημεία

  • Factory — δημιουργικό πρότυπο για δημιουργία αντικειμένων χωρίς καθορισμό συγκεκριμένης κλάσης
  • Factory Method — μέθοδος στην υπερκλάση που παρακάμπτεται στις υποκλάσεις για δημιουργία αντικειμένων
  • Abstract Factory — διεπαφή για δημιουργία οικογενειών αλληλοσυνδεόμενων αντικειμένων
  • Δοκιμές — τα εργοστάσια απλοποιούν την αντικατάσταση υλοποιήσεων με αντικείμενα mock στις δοκιμές
  • DI vs Factory — το Dependency Injection αντικαθιστά τα εργοστάσια σε σύγχρονες εφαρμογές

Τι είναι το Factory: η ουσία του προτύπου δημιουργίας αντικειμένων;

Factory — ένα δημιουργικό πρότυπο σχεδίασης από τον κατάλογο GoF. Η βασική ιδέα: μεταφορά της λογικής δημιουργίας αντικειμένων από τον κώδικα πελάτη σε μια ξεχωριστή μέθοδο ή κλάση. Ο πελάτης εργάζεται με μια διεπαφή ή αφηρημένη κλάση, και η συγκεκριμένη υλοποίηση δημιουργείται από το εργοστάσιο. Αυτό υλοποιεί την αρχή της αντιστροφής εξαρτήσεων (Dependency Inversion): ο πελάτης δεν εξαρτάται από συγκεκριμένες κλάσεις, αλλά μόνο από αφαιρέσεις.

Δύο παραλλαγές Factory: Factory Method και Abstract Factory. Factory Method — μία μέθοδος σε μια κλάση που οι υποκλάσεις παρακάμπτουν για να δημιουργήσουν αντικείμενα. Abstract Factory — μια διεπαφή με μια οικογένεια εργοστασιακών μεθόδων για δημιουργία ομάδων αλληλοσυνδεόμενων αντικειμένων. Και οι δύο παραλλαγές λύνουν το ίδιο πρόβλημα: ο πελάτης δεν καλεί απευθείας new MyClass(), αλλά ζητά από το εργοστάσιο να δημιουργήσει ένα αντικείμενο ανάλογα με τον τύπο ή τις παραμέτρους του.

Factory vs new() — η άμεση δημιουργία αντικειμένων συνδέει άκαμπτα τον κώδικα με μια συγκεκριμένη υλοποίηση. Το Factory προσθέτει ένα ενδιάμεσο επίπεδο: η αλλαγή υλοποίησης απαιτεί τροποποίηση μόνο στο εργοστάσιο, όχι σε όλους τους πελάτες. Στην κινητή ανάπτυξη, το Factory χρησιμοποιείται ενεργά για δημιουργία ViewModel (ViewModelProvider.Factory), δικτυακών πελατών (Retrofit.create()), προσαρμογέων λιστών και εργοστασίων σειριοποίησης. Τα κοντέινερ DI (Dagger, Koin) δημιουργούν αυτόματα εργοστάσια.

Factory Method: παραδείγματα σε Swift και Kotlin

Factory Method — μια μέθοδος που δηλώνεται σε ένα πρωτόκολλο ή αφηρημένη κλάση και επιστρέφει ένα αντικείμενο συγκεκριμένου τύπου. Οι υποκλάσεις υλοποιούν αυτή τη μέθοδο, δημιουργώντας συγκεκριμένα στιγμιότυπα. Στη Swift μπορεί να είναι static method σε ένα πρωτόκολλο ή μέθοδος σε μια βασική κλάση. Στην Kotlin — companion object με εργοστασιακή μέθοδο ή open fun σε μια αφηρημένη κλάση. Το πρότυπο χρησιμοποιείται ευρέως για δημιουργία αναλυτών, εργοστασίων σφαλμάτων και κατασκευαστών ερωτημάτων.

swift
protocol PaymentGateway {
    func processPayment(amount: Decimal) async throws -> PaymentResult
}

final class StripeGateway: PaymentGateway { /* ... */ }
final class ApplePayGateway: PaymentGateway { /* ... */ }

enum PaymentType { case stripe, applePay }

final class PaymentFactory {
    // Factory Method
    static func create(type: PaymentType) -> PaymentGateway {
        switch type {
        case .stripe: return StripeGateway()
        case .applePay: return ApplePayGateway()
        }
    }
}

// Χρήση
let gateway = PaymentFactory.create(type: .stripe)

Έκδοση Kotlin Factory Method χρησιμοποιεί companion object ή sealed class για περιορισμό τύπων. Η sealed class εγγυάται ότι ο κλάδος when καλύπτει όλους τους πιθανούς τύπους — ο μεταγλωττιστής ελέγχει την πληρότητα. Αυτό είναι τυπικό για έργα Android, όπου το εργοστάσιο δημιουργεί διαφορετικές υλοποιήσεις Repository ή DataSource ανάλογα με το build flavour ή τη διαμόρφωση.

kotlin
sealed class PaymentType {
    object Stripe : PaymentType()
    object ApplePay : PaymentType()
}

interface PaymentGateway {
    suspend fun processPayment(amount: BigDecimal): PaymentResult
}

class PaymentFactory {
    companion object {
        fun create(type: PaymentType): PaymentGateway = when (type) {
            PaymentType.Stripe -> StripeGateway()
            PaymentType.ApplePay -> ApplePayGateway()
        }
    }
}

Abstract Factory: οικογένειες αλληλοσυνδεόμενων αντικειμένων

Abstract Factory — πρότυπο για δημιουργία οικογενειών αλληλοσυνδεόμενων ή αλληλοεξαρτώμενων αντικειμένων χωρίς καθορισμό των συγκεκριμένων κλάσεών τους. Ο πελάτης εργάζεται με τη διεπαφή του αφηρημένου εργοστασίου, η οποία ορίζει μεθόδους για τη δημιουργία κάθε προϊόντος της οικογένειας. Το συγκεκριμένο εργοστάσιο υλοποιεί τη διεπαφή και δημιουργεί αντικείμενα συγκεκριμένης παραλλαγής. Για παράδειγμα, ένα εργοστάσιο στοιχείων UI για iOS δημιουργεί UIButton, UILabel, UITableView, και για Android — Button, TextView, RecyclerView.

Abstract Factory vs Factory Method — το Factory Method δημιουργεί έναν τύπο αντικειμένου μέσω κληρονομικότητας, το Abstract Factory δημιουργεί μια οικογένεια αντικειμένων μέσω σύνθεσης. Το Factory Method παρακάμπτεται σε υποκλάσεις, το Abstract Factory παρέχει πολλαπλές εργοστασιακές μεθόδους μέσω ενός πρωτοκόλλου. Το Abstract Factory συχνά περιέχει πολλαπλά Factory Method. Στην κινητή ανάπτυξη, το Abstract Factory χρησιμοποιείται για στοιχεία εξαρτώμενα από πλατφόρμα, θέματα και εργοστάσια βάσεων δεδομένων.

ΧαρακτηριστικόFactory MethodAbstract Factory
Αριθμός προϊόντωνΈναΟικογένεια (πολλαπλά)
ΜηχανισμόςΚληρονομικότητα (override)Σύνθεση (protocol/interface)
Παράδειγμα iOSPaymentFactory.create()UIComponentFactory για iOS/Android
Παράδειγμα AndroidViewModelProvider.FactoryThemeFactory: δημιουργία κουμπιών, κειμένων, καρτών
ΕυελιξίαΑπλή αντικατάσταση υποκλάσηςΠλήρης αντικατάσταση οικογένειας

Πραγματική περίπτωση Abstract Factory σε Android — υλοποίηση διαφορετικών τύπων βάσεων δεδομένων (SQLite vs Room) μέσω ενοποιημένης διεπαφής DatabaseFactory. Το εργοστάσιο δημιουργεί αντικείμενα DAO, μεταναστεύσεις και ομάδες συνδέσεων. Σε iOS — εργοστάσιο υπηρεσιών για διαφορετικά περιβάλλοντα (Development/Staging/Production). Το Abstract Factory σπάνια χρησιμοποιείται άμεσα — οι λειτουργίες του αναλαμβάνονται από κοντέινερ DI (Dagger Module, Swinject Assembly).

Factory σε iOS: πρωτόκολλα και στατικές μέθοδοι

Swift Factory υλοποιείται μέσω πρωτοκόλλων και στατικών μεθόδων. Το πρωτόκολλο Factory δηλώνει τη μέθοδο create() που επιστρέφει έναν αφηρημένο τύπο. Το συγκεκριμένο εργοστάσιο υλοποιεί το πρωτόκολλο και δημιουργεί τα απαραίτητα αντικείμενα. Η Swift δεν απαιτεί ξεχωριστή εργοστασιακή κλάση για απλές περιπτώσεις — αρκεί μια στατική μέθοδος σε enum ή struct. Για σύνθετα σενάρια, χρησιμοποιείται το πρωτόκολλο Factory με ένεση μέσω DI.

Factory στο iOS SDK — πολλά συστημικά εργοστάσια: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:). Οι προγραμματιστές δημιουργούν εργοστάσια για ViewController (StoryboardFactory), για υπηρεσίες (ServiceFactory) και για μοντέλα δεδομένων. Το Factory Method χρησιμοποιείται ενεργά στις αρχιτεκτονικές VIPER και Clean Swift για δημιουργία μονάδων οθόνης.

Factory + DI — σύγχρονη εναλλακτική: το κοντέινερ DI (Swinject, Factory) δημιουργεί αυτόματα εργοστάσια για καταχωρημένους τύπους. Το κοντέινερ αποθηκεύει συνταγές δημιουργίας αντικειμένων και επιλύει εξαρτήσεις. Η βιβλιοθήκη Factory (github.com/hmlongco/Factory) χρησιμοποιεί @Injected(.service) για αυτόματη ένεση. Τα εργοστάσια DI δοκιμάζονται αντικαθιστώντας ολόκληρη την ενότητα με μία γραμμή: container.register { MockService() }.

Factory σε Android: companion factory και ενότητες DI

Android Factory — κλασικό παράδειγμα: ViewModelProvider.Factory για δημιουργία ViewModel με παραμέτρους. Η Google συνιστά τη χρήση Hilt για αυτόματη δημιουργία εργοστασίων ViewModel — η σημείωση @HiltViewModel δημιουργεί αυτόματα Factory. Για απλά αντικείμενα χρησιμοποιείται companion object με μέθοδο create() ή invoke(). Στην Kotlin, ο τελεστής invoke επιτρέπει την κλήση του εργοστασίου ως συνάρτησης: Factory(param).

Factory στο Jetpack Compose — τα εργοστάσια χρησιμοποιούνται για δημιουργία καταστάσεων και εφέ. Το remember { Factory.create() } δημιουργεί ένα αντικείμενο κατά την πρώτη απόδοση και το διατηρεί για τη διάρκεια ζωής του composable. Το ViewModel στο Compose δημιουργείται μέσω viewModel() — αυτό είναι ένα εργοστάσιο που διαχειρίζεται το Hilt. Στο Compose, τα εργοστάσια εμφανίζονται λιγότερο συχνά ρητά, επειδή το DI και το Compose StateManager αναλαμβάνουν τη δημιουργία αντικειμένων.

Factory vs Hilt — το Dagger/Hilt δημιουργεί αυτόματα εργοστάσια στη φάση μεταγλώττισης. Το @Module + @Provides αντικαθιστά το Factory Method, το @Binds αντικαθιστά το Abstract Factory. Τα χειροκίνητα εργοστάσια παραμένουν σχετικά για δυναμική επιλογή υλοποίησης κατά το χρόνο εκτέλεσης (A/B δοκιμές, feature flags). Για στατικές εξαρτήσεις, το Hilt αυτοματοποιεί πλήρως τη δημιουργία αντικειμένων — ο προγραμματιστής γράφει μόνο τη διεπαφή και τις σημειώσεις.

Συχνές ερωτήσεις

Πώς διαφέρει το Factory Method από το Abstract Factory;

Το Factory Method δημιουργεί έναν τύπο αντικειμένου μέσω κληρονομικότητας — η υποκλάση παρακάμπτει την εργοστασιακή μέθοδο. Το Abstract Factory δημιουργεί μια οικογένεια αντικειμένων μέσω σύνθεσης — η διεπαφή εργοστασίου δηλώνει μεθόδους για πολλαπλά προϊόντα. Το Factory Method είναι απλούστερο, το Abstract Factory είναι πιο ευέλικτο για στοιχεία εξαρτώμενα από πλατφόρμα ή θεματικά στοιχεία.

Πότε να χρησιμοποιήσουμε Factory αντί για DI;

Το Factory δικαιολογείται για δυναμική επιλογή υλοποίησης κατά το χρόνο εκτέλεσης (A/B δοκιμές, feature flags, διαφορετικό API για διαφορετικά τιμολόγια). Το DI (Hilt, Dagger, Koin) προτιμάται για στατικές εξαρτήσεις — αυτοματοποιεί τη δημιουργία και την ένεση. Το Factory και το DI δεν αλληλοαποκλείονται: το DI μπορεί να χρησιμοποιεί Factory μέσα σε μια ενότητα.

Πώς δοκιμάζουμε κώδικα που χρησιμοποιεί Factory;

Το Factory δοκιμάζεται αντικαθιστώντας το εργοστάσιο μέσω ενός πρωτοκόλλου. Στη δοκιμή δημιουργείται ένα TestFactory που υλοποιεί το ίδιο πρωτόκολλο και επιστρέφει αντικείμενα mock. Για στατικές μεθόδους Factory, η δοκιμή είναι δυσκολότερη — απαιτεί κοντέινερ DI ή swizzling. Συνιστάται να χρησιμοποιείτε πάντα πρωτόκολλο για το Factory για να διατηρήσετε τη δυνατότητα δοκιμής.

Τι είναι το ViewModelProvider.Factory στο Android;

ViewModelProvider.Factory — μια διεπαφή από το Jetpack που επιτρέπει τη δημιουργία ViewModel με προσαρμοσμένες παραμέτρους. Χωρίς εργοστάσιο, το ViewModel δημιουργείται μέσω αντανάκλασης και μπορεί να έχει μόνο κενό κατασκευαστή. Το Factory δέχεται παραμέτρους (αποθετήριο, application context) και τις μεταβιβάζει στον κατασκευαστή του ViewModel. Το Hilt δημιουργεί αυτόματα Factory για @HiltViewModel.

Πώς συνδέεται το Factory με την αρχή ανοιχτού/κλειστού;

Το Factory υλοποιεί την αρχή Open-Closed: το σύστημα είναι ανοιχτό για επέκταση (νέα υλοποίηση προστίθεται στο εργοστάσιο), αλλά κλειστό για τροποποίηση (ο κώδικας πελάτη δεν αλλάζει). Η προσθήκη νέου τύπου προϊόντος απαιτεί αλλαγή μόνο στο εργοστάσιο, όχι σε όλους τους πελάτες. Αυτό είναι το βασικό πλεονέκτημα του Factory έναντι της άμεσης δημιουργίας αντικειμένων.

Σύνοψη

  • Factory — δημιουργικό πρότυπο για δημιουργία αντικειμένων μέσω αφαίρεσης
  • Factory Method — μία μέθοδος που παρακάμπτεται σε υποκλάσεις
  • Abstract Factory — διεπαφή για δημιουργία οικογένειας αντικειμένων
  • iOS — πρωτόκολλα και στατικές μέθοδοι για εργοστάσια
  • Android — companion object, ViewModelProvider.Factory, Hilt
  • DI vs Factory — DI αυτοματοποιεί τη δημιουργία, Factory για δυναμική επιλογή
  • Δοκιμές — το πρωτόκολλο Factory είναι υποχρεωτικό για αντικατάσταση υλοποιήσεων

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης