The FACTORY clause is used in object-oriented COBOL to define factory methods that provide controlled and flexible object creation mechanisms. Factory methods allow for different initialization strategies and creation logic beyond simple object instantiation.
FACTORY enables sophisticated object creation patterns in object-oriented COBOL.
The FACTORY clause follows specific syntax patterns and is used within class definitions in object-oriented COBOL.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152* Basic FACTORY clause syntax FACTORY. METHOD-ID factory-method-name. DATA DIVISION. LINKAGE SECTION. * Parameters for factory method PROCEDURE DIVISION USING parameters RETURNING object-reference. * Factory method logic * Object creation and initialization END METHOD. END FACTORY. * Examples FACTORY. METHOD-ID CreateInstance. DATA DIVISION. LINKAGE SECTION. 01 PARAM1 PIC X(50). 01 RETURN-OBJECT OBJECT REFERENCE. PROCEDURE DIVISION USING PARAM1 RETURNING RETURN-OBJECT. * Create and return object INVOKE SELF "new" RETURNING RETURN-OBJECT END METHOD. END FACTORY. * Complete example with multiple factory methods CLASS-ID MyClass. DATA DIVISION. WORKING-STORAGE SECTION. 01 INSTANCE-DATA PIC X(100). FACTORY. METHOD-ID CreateDefault. DATA DIVISION. LINKAGE SECTION. 01 RETURN-OBJECT OBJECT REFERENCE. PROCEDURE DIVISION RETURNING RETURN-OBJECT. INVOKE SELF "new" RETURNING RETURN-OBJECT INVOKE RETURN-OBJECT "InitializeDefault" END METHOD. METHOD-ID CreateWithData. DATA DIVISION. LINKAGE SECTION. 01 INPUT-DATA PIC X(100). 01 RETURN-OBJECT OBJECT REFERENCE. PROCEDURE DIVISION USING INPUT-DATA RETURNING RETURN-OBJECT. INVOKE SELF "new" RETURNING RETURN-OBJECT INVOKE RETURN-OBJECT "InitializeWithData" USING INPUT-DATA END METHOD. END FACTORY. END-CLASS.
FACTORY is used within class definitions to create factory methods for object instantiation.
Factory Type | Description | Use Case |
---|---|---|
Simple Factory | Basic object creation | Standard object instantiation |
Parameterized Factory | Creation with parameters | Objects with specific initialization |
Abstract Factory | Family of related objects | Related object creation |
Builder Factory | Complex object construction | Complex object creation |
Singleton Factory | Single instance creation | Unique object instances |
123456789101112131415161718192021222324252627282930313233343536* Using FACTORY methods for object creation PROCEDURE DIVISION. * Create objects using factory methods INVOKE MyClass "CreateDefault" RETURNING default-obj INVOKE MyClass "CreateWithData" USING "Custom Data" RETURNING custom-obj * Use the created objects INVOKE default-obj "ProcessData" INVOKE custom-obj "ProcessData" * Factory method with validation INVOKE MyClass "CreateValidated" USING input-param RETURNING validated-obj IF validated-obj = NULL DISPLAY "Object creation failed - invalid parameters" ELSE INVOKE validated-obj "ProcessData" END-IF * Factory method implementation with validation FACTORY. METHOD-ID CreateValidated. DATA DIVISION. LINKAGE SECTION. 01 INPUT-PARAM PIC X(50). 01 RETURN-OBJECT OBJECT REFERENCE. PROCEDURE DIVISION USING INPUT-PARAM RETURNING RETURN-OBJECT. * Validate input parameter IF INPUT-PARAM = SPACES OR INPUT-PARAM = LOW-VALUES MOVE NULL TO RETURN-OBJECT ELSE * Create object with valid parameter INVOKE SELF "new" RETURNING RETURN-OBJECT INVOKE RETURN-OBJECT "InitializeWithData" USING INPUT-PARAM END-IF END METHOD. END FACTORY.
FACTORY methods provide controlled object creation with validation and initialization.
FACTORY is commonly used in specific scenarios where controlled and flexible object creation is needed.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546* Parameterized object creation with FACTORY CLASS-ID DatabaseConnection. DATA DIVISION. WORKING-STORAGE SECTION. 01 CONNECTION-STRING PIC X(200). 01 USERNAME PIC X(50). 01 PASSWORD PIC X(50). FACTORY. METHOD-ID CreateConnection. DATA DIVISION. LINKAGE SECTION. 01 DB-URL PIC X(200). 01 DB-USER PIC X(50). 01 DB-PASS PIC X(50). 01 RETURN-CONNECTION OBJECT REFERENCE. PROCEDURE DIVISION USING DB-URL DB-USER DB-PASS RETURNING RETURN-CONNECTION. * Create connection object INVOKE SELF "new" RETURNING RETURN-CONNECTION * Initialize with parameters INVOKE RETURN-CONNECTION "InitializeConnection" USING DB-URL DB-USER DB-PASS END METHOD. METHOD-ID CreateDefaultConnection. DATA DIVISION. LINKAGE SECTION. 01 RETURN-CONNECTION OBJECT REFERENCE. PROCEDURE DIVISION RETURNING RETURN-CONNECTION. * Create with default parameters INVOKE SELF "CreateConnection" USING "localhost:5432/mydb" "admin" "password" RETURNING RETURN-CONNECTION END METHOD. END FACTORY. END-CLASS. * Usage PROCEDURE DIVISION. * Create connections using factory methods INVOKE DatabaseConnection "CreateConnection" USING "server:3306/production" "prod_user" "prod_pass" RETURNING prod-connection INVOKE DatabaseConnection "CreateDefaultConnection" RETURNING default-connection
Create objects with different initialization parameters using factory methods.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546* Object pooling with FACTORY CLASS-ID ConnectionPool. DATA DIVISION. WORKING-STORAGE SECTION. 01 POOL-SIZE PIC 9(4) VALUE 10. 01 AVAILABLE-CONNECTIONS OCCURS 10 TIMES. 02 CONNECTION-OBJECT OBJECT REFERENCE. 02 IS-AVAILABLE PIC X VALUE 'Y'. FACTORY. METHOD-ID GetConnection. DATA DIVISION. LINKAGE SECTION. 01 RETURN-CONNECTION OBJECT REFERENCE. PROCEDURE DIVISION RETURNING RETURN-CONNECTION. * Find available connection in pool PERFORM VARYING I FROM 1 BY 1 UNTIL I > POOL-SIZE IF IS-AVAILABLE(I) = 'Y' MOVE CONNECTION-OBJECT(I) TO RETURN-CONNECTION MOVE 'N' TO IS-AVAILABLE(I) EXIT PERFORM END-IF END-PERFORM * If no available connection, create new one IF RETURN-CONNECTION = NULL INVOKE DatabaseConnection "CreateDefaultConnection" RETURNING RETURN-CONNECTION END-IF END METHOD. METHOD-ID ReturnConnection. DATA DIVISION. LINKAGE SECTION. 01 CONNECTION-TO-RETURN OBJECT REFERENCE. PROCEDURE DIVISION USING CONNECTION-TO-RETURN. * Return connection to pool PERFORM VARYING I FROM 1 BY 1 UNTIL I > POOL-SIZE IF CONNECTION-OBJECT(I) = CONNECTION-TO-RETURN MOVE 'Y' TO IS-AVAILABLE(I) EXIT PERFORM END-IF END-PERFORM END METHOD. END FACTORY. END-CLASS.
Implement object pooling for efficient resource management.
123456789101112131415161718192021222324252627282930313233343536373839404142434445* Singleton pattern with FACTORY CLASS-ID ConfigurationManager. DATA DIVISION. WORKING-STORAGE SECTION. 01 INSTANCE OBJECT REFERENCE. 01 CONFIG-DATA PIC X(1000). FACTORY. METHOD-ID GetInstance. DATA DIVISION. LINKAGE SECTION. 01 RETURN-INSTANCE OBJECT REFERENCE. PROCEDURE DIVISION RETURNING RETURN-INSTANCE. * Return existing instance or create new one IF INSTANCE = NULL INVOKE SELF "new" RETURNING INSTANCE INVOKE INSTANCE "LoadConfiguration" END-IF MOVE INSTANCE TO RETURN-INSTANCE END METHOD. END FACTORY. METHOD-ID LoadConfiguration. DATA DIVISION. PROCEDURE DIVISION. * Load configuration from file or database MOVE "Default configuration data" TO CONFIG-DATA END METHOD. METHOD-ID GetConfigValue. DATA DIVISION. LINKAGE SECTION. 01 CONFIG-KEY PIC X(50). 01 CONFIG-VALUE PIC X(100). PROCEDURE DIVISION USING CONFIG-KEY RETURNING CONFIG-VALUE. * Return configuration value based on key MOVE "Default value" TO CONFIG-VALUE END METHOD. END-CLASS. * Usage PROCEDURE DIVISION. * Get singleton instance INVOKE ConfigurationManager "GetInstance" RETURNING config-manager INVOKE config-manager "GetConfigValue" USING "database_url" RETURNING db-url
Implement singleton pattern for unique object instances.
Following these best practices ensures effective use of the FACTORY clause for proper object creation.
Pitfall | Problem | Solution |
---|---|---|
Complex factory methods | Difficult to maintain and understand | Keep factory methods simple and focused |
No parameter validation | Invalid objects created | Always validate parameters in factory methods |
Inconsistent naming | Confusing and hard to use | Use consistent naming conventions |
No error handling | Creation failures not handled | Handle creation failures gracefully |
Overuse of factories | Unnecessary complexity | Use factories only when needed |
Use Case | FACTORY Suitability | Reasoning |
---|---|---|
Complex object creation | Excellent | Perfect for complex initialization logic |
Parameter validation | Excellent | Ideal for validating creation parameters |
Object pooling | Excellent | Excellent for resource management |
Simple object creation | Poor | Overkill for simple instantiation |
Performance-critical code | Poor | Factory overhead may be too high |
Usage | Syntax | Example |
---|---|---|
Basic factory | FACTORY with METHOD-ID | FACTORY with CreateInstance method |
Parameterized factory | FACTORY with USING parameters | FACTORY with CreateWithData USING param |
Factory method call | INVOKE class-name "method-name" | INVOKE MyClass "CreateInstance" |
Factory with validation | FACTORY with parameter checking | FACTORY with CreateValidated method |
Multiple factory methods | FACTORY with multiple METHOD-ID | FACTORY with CreateDefault and CreateCustom |
1. What is the primary purpose of the FACTORY clause in COBOL?
2. Where is the FACTORY clause typically used?
3. What is the main benefit of using FACTORY methods?
4. When is the FACTORY clause most useful?
5. How does FACTORY relate to object creation?
Understanding the CLASS-ID clause for class definition.
Understanding the METHOD-ID clause for method definition.
Complete guide to object-oriented COBOL programming.
Understanding object creation in COBOL.
Understanding design patterns in COBOL.