☕ 🏭 Model Factories in TuskLang Java

Java Documentation

🏭 Model Factories in TuskLang Java

"We don't bow to any king" - Build factories like a Java architect

TuskLang Java provides sophisticated model factories that integrate seamlessly with Spring Boot, JPA, and modern Java patterns. Create, configure, and manage your data models with enterprise-grade factory patterns.

🎯 Overview

Model factories in TuskLang Java combine the power of Java factory patterns with TuskLang's configuration system. From JPA entity factories to Spring Boot service factories, we'll show you how to build robust, scalable model creation systems.

🔧 Core Factory Features

1. JPA Entity Factories

import org.tusklang.java.TuskLang;
import org.tusklang.java.factory.TuskEntityFactory;
import javax.persistence.*;
import java.util.Map;

@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; @Column(unique = true, nullable = false) private String email; @Column(name = "created_at") private java.time.LocalDateTime createdAt; // Constructors, getters, setters public User() {} public User(String name, String email) { this.name = name; this.email = email; this.createdAt = java.time.LocalDateTime.now(); } // Getters and setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public java.time.LocalDateTime getCreatedAt() { return createdAt; } public void setCreatedAt(java.time.LocalDateTime createdAt) { this.createdAt = createdAt; } }

public class EntityFactoryExample { public static void main(String[] args) { TuskLang parser = new TuskLang(); String tskContent = """ [entity_factories] # JPA Entity Factory Configuration enable_auto_generation: true enable_validation: true enable_auditing: true [user_factory] # User entity factory entity_class: "com.example.User" default_values: { created_at: @date.now() active: true role: "user" } validation_rules: { name: ["required", "min_length:2", "max_length:100"] email: ["required", "email", "unique"] password: ["required", "min_length:8"] } factory_methods: { create_admin: """ function createAdmin(name, email) { return { name: name, email: email, role: "admin", active: true, created_at: @date.now() } } """ create_premium_user: """ function createPremiumUser(name, email, plan) { return { name: name, email: email, role: "premium", plan: plan, active: true, created_at: @date.now() } } """ } [order_factory] # Order entity factory entity_class: "com.example.Order" default_values: { status: "pending" created_at: @date.now() updated_at: @date.now() } validation_rules: { user_id: ["required", "exists:users,id"] total_amount: ["required", "min:0"] items: ["required", "min_count:1"] } factory_methods: { create_from_cart: """ function createFromCart(userId, cartItems) { let total = 0; for (let item of cartItems) { total += item.price * item.quantity; } return { user_id: userId, items: cartItems, total_amount: total, status: "pending", created_at: @date.now() } } """ } """; Map<String, Object> config = parser.parse(tskContent); // Initialize entity factory TuskEntityFactory entityFactory = new TuskEntityFactory(); entityFactory.configure(config); // Create entities using factory User adminUser = entityFactory.createEntity("user_factory", "create_admin", Map.of("name", "Admin User", "email", "admin@example.com")); User premiumUser = entityFactory.createEntity("user_factory", "create_premium_user", Map.of("name", "Premium User", "email", "premium@example.com", "plan", "gold")); // Validate entities boolean isValid = entityFactory.validateEntity(adminUser); System.out.println("Admin user valid: " + isValid); } }

2. Spring Boot Service Factories

import org.tusklang.java.TuskLang;
import org.tusklang.java.factory.TuskServiceFactory;
import org.springframework.stereotype.Service;
import org.springframework.context.annotation.Bean;
import java.util.Map;

@Service public class UserService { private final UserRepository userRepository; private final EmailService emailService; public UserService(UserRepository userRepository, EmailService emailService) { this.userRepository = userRepository; this.emailService = emailService; } public User createUser(String name, String email) { User user = new User(name, email); user = userRepository.save(user); emailService.sendWelcomeEmail(user); return user; } }

@Service public class OrderService { private final OrderRepository orderRepository; private final PaymentService paymentService; public OrderService(OrderRepository orderRepository, PaymentService paymentService) { this.orderRepository = orderRepository; this.paymentService = paymentService; } public Order createOrder(Long userId, List<OrderItem> items) { Order order = new Order(userId, items); order = orderRepository.save(order); paymentService.processPayment(order); return order; } }

public class ServiceFactoryExample { public static void main(String[] args) { TuskLang parser = new TuskLang(); String tskContent = """ [service_factories] # Spring Boot Service Factory Configuration enable_dependency_injection: true enable_transaction_management: true enable_caching: true [user_service_factory] # User service factory service_class: "com.example.UserService" dependencies: ["userRepository", "emailService"] factory_methods: { create_user_service: """ function createUserService(userRepo, emailSvc) { return new UserService(userRepo, emailSvc); } """ create_user_with_validation: """ function createUserWithValidation(name, email) { // Validation logic if (!name || name.length < 2) { throw new Error("Name must be at least 2 characters"); } if (!email || !email.contains("@")) { throw new Error("Invalid email format"); } return { name: name, email: email, created_at: @date.now() } } """ } [order_service_factory] # Order service factory service_class: "com.example.OrderService" dependencies: ["orderRepository", "paymentService"] factory_methods: { create_order_service: """ function createOrderService(orderRepo, paymentSvc) { return new OrderService(orderRepo, paymentSvc); } """ create_order_with_items: """ function createOrderWithItems(userId, items) { let total = 0; for (let item of items) { total += item.price * item.quantity; } return { user_id: userId, items: items, total_amount: total, status: "pending", created_at: @date.now() } } """ } [email_service_factory] # Email service factory service_class: "com.example.EmailService" dependencies: ["emailTemplateService", "smtpConfig"] factory_methods: { create_email_service: """ function createEmailService(templateSvc, smtpConfig) { return new EmailService(templateSvc, smtpConfig); } """ create_welcome_email: """ function createWelcomeEmail(user) { return { to: user.email, subject: "Welcome to " + @env("APP_NAME"), template: "welcome", data: { name: user.name, login_url: @env("APP_URL") + "/login" } } } """ } """; Map<String, Object> config = parser.parse(tskContent); // Initialize service factory TuskServiceFactory serviceFactory = new TuskServiceFactory(); serviceFactory.configure(config); // Create services using factory UserService userService = serviceFactory.createService("user_service_factory", "create_user_service"); OrderService orderService = serviceFactory.createService("order_service_factory", "create_order_service"); EmailService emailService = serviceFactory.createService("email_service_factory", "create_email_service"); // Use services User user = userService.createUser("John Doe", "john@example.com"); System.out.println("Created user: " + user.getName()); } }

3. Repository Factories

import org.tusklang.java.TuskLang;
import org.tusklang.java.factory.TuskRepositoryFactory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import java.util.Map;

public interface UserRepository extends JpaRepository<User, Long> { User findByEmail(String email); List<User> findByActive(boolean active); List<User> findByCreatedAtAfter(java.time.LocalDateTime date); }

public interface OrderRepository extends JpaRepository<Order, Long> { List<Order> findByUserId(Long userId); List<Order> findByStatus(String status); List<Order> findByCreatedAtBetween(java.time.LocalDateTime start, java.time.LocalDateTime end); }

public class RepositoryFactoryExample { public static void main(String[] args) { TuskLang parser = new TuskLang(); String tskContent = """ [repository_factories] # Repository Factory Configuration enable_custom_queries: true enable_query_optimization: true enable_caching: true [user_repository_factory] # User repository factory repository_class: "com.example.UserRepository" entity_class: "com.example.User" custom_queries: { find_active_users: """ SELECT u FROM User u WHERE u.active = true ORDER BY u.createdAt DESC """ find_users_by_role: """ SELECT u FROM User u WHERE u.role = :role AND u.active = true """ count_users_by_date_range: """ SELECT COUNT(u) FROM User u WHERE u.createdAt BETWEEN :startDate AND :endDate """ } factory_methods: { create_user_repository: """ function createUserRepository(entityManager) { return new UserRepository(entityManager); } """ create_user_with_filters: """ function createUserWithFilters(role, active, limit) { return { role: role, active: active, limit: limit || 100, order_by: "created_at DESC" } } """ } [order_repository_factory] # Order repository factory repository_class: "com.example.OrderRepository" entity_class: "com.example.Order" custom_queries: { find_orders_by_user: """ SELECT o FROM Order o WHERE o.userId = :userId ORDER BY o.createdAt DESC """ find_orders_by_status: """ SELECT o FROM Order o WHERE o.status = :status AND o.createdAt > :since """ calculate_total_sales: """ SELECT SUM(o.totalAmount) FROM Order o WHERE o.status = 'completed' AND o.createdAt BETWEEN :startDate AND :endDate """ } factory_methods: { create_order_repository: """ function createOrderRepository(entityManager) { return new OrderRepository(entityManager); } """ create_order_filters: """ function createOrderFilters(status, startDate, endDate) { return { status: status, start_date: startDate, end_date: endDate, order_by: "created_at DESC" } } """ } """; Map<String, Object> config = parser.parse(tskContent); // Initialize repository factory TuskRepositoryFactory repositoryFactory = new TuskRepositoryFactory(); repositoryFactory.configure(config); // Create repositories using factory UserRepository userRepository = repositoryFactory.createRepository("user_repository_factory", "create_user_repository"); OrderRepository orderRepository = repositoryFactory.createRepository("order_repository_factory", "create_order_repository"); // Use repositories with custom queries List<User> activeUsers = userRepository.findByActive(true); List<Order> userOrders = orderRepository.findByUserId(1L); System.out.println("Active users: " + activeUsers.size()); System.out.println("User orders: " + userOrders.size()); } }

4. DTO (Data Transfer Object) Factories

import org.tusklang.java.TuskLang;
import org.tusklang.java.factory.TuskDTOFactory;
import java.util.Map;

public class UserDTO { private Long id; private String name; private String email; private String role; private boolean active; private java.time.LocalDateTime createdAt; // Constructors public UserDTO() {} public UserDTO(User user) { this.id = user.getId(); this.name = user.getName(); this.email = user.getEmail(); this.role = user.getRole(); this.active = user.isActive(); this.createdAt = user.getCreatedAt(); } // Getters and setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } public java.time.LocalDateTime getCreatedAt() { return createdAt; } public void setCreatedAt(java.time.LocalDateTime createdAt) { this.createdAt = createdAt; } }

public class DTOFactoryExample { public static void main(String[] args) { TuskLang parser = new TuskLang(); String tskContent = """ [dto_factories] # DTO Factory Configuration enable_auto_mapping: true enable_validation: true enable_transformation: true [user_dto_factory] # User DTO factory dto_class: "com.example.UserDTO" entity_class: "com.example.User" mapping_rules: { id: "id" name: "name" email: "email" role: "role" active: "active" created_at: "createdAt" } factory_methods: { create_user_dto: """ function createUserDTO(user) { return { id: user.id, name: user.name, email: user.email, role: user.role, active: user.active, created_at: user.createdAt } } """ create_user_dto_with_mask: """ function createUserDTOWithMask(user, maskEmail) { let dto = { id: user.id, name: user.name, role: user.role, active: user.active, created_at: user.createdAt } if (maskEmail) { dto.email = maskEmailAddress(user.email); } else { dto.email = user.email; } return dto; } function maskEmailAddress(email) { let parts = email.split('@'); let username = parts[0]; let domain = parts[1]; if (username.length <= 2) { return username + '@' + domain; } return username.substring(0, 2) + '*@' + domain; } """ create_user_summary_dto: """ function createUserSummaryDTO(user) { return { id: user.id, name: user.name, role: user.role, active: user.active } } """ } [order_dto_factory] # Order DTO factory dto_class: "com.example.OrderDTO" entity_class: "com.example.Order" mapping_rules: { id: "id" user_id: "userId" total_amount: "totalAmount" status: "status" created_at: "createdAt" items: "items" } factory_methods: { create_order_dto: """ function createOrderDTO(order) { return { id: order.id, user_id: order.userId, total_amount: order.totalAmount, status: order.status, created_at: order.createdAt, items: order.items } } """ create_order_summary_dto: """ function createOrderSummaryDTO(order) { return { id: order.id, total_amount: order.totalAmount, status: order.status, item_count: order.items.length, created_at: order.createdAt } } """ } """; Map<String, Object> config = parser.parse(tskContent); // Initialize DTO factory TuskDTOFactory dtoFactory = new TuskDTOFactory(); dtoFactory.configure(config); // Create DTOs using factory User user = new User("John Doe", "john@example.com"); user.setId(1L); user.setRole("user"); user.setActive(true); UserDTO userDTO = dtoFactory.createDTO("user_dto_factory", "create_user_dto", user); UserDTO maskedDTO = dtoFactory.createDTO("user_dto_factory", "create_user_dto_with_mask", Map.of("user", user, "maskEmail", true)); UserDTO summaryDTO = dtoFactory.createDTO("user_dto_factory", "create_user_summary_dto", user); System.out.println("Full DTO: " + userDTO.getEmail()); System.out.println("Masked DTO: " + maskedDTO.getEmail()); System.out.println("Summary DTO: " + summaryDTO.getName()); } }

🚀 Advanced Factory Patterns

1. Abstract Factory Pattern

import org.tusklang.java.TuskLang;
import org.tusklang.java.factory.TuskAbstractFactory;
import java.util.Map;

public interface UserFactory { User createUser(String name, String email); UserDTO createUserDTO(User user); UserService createUserService(); }

public interface OrderFactory { Order createOrder(Long userId, List<OrderItem> items); OrderDTO createOrderDTO(Order order); OrderService createOrderService(); }

public class AbstractFactoryExample { public static void main(String[] args) { TuskLang parser = new TuskLang(); String tskContent = """ [abstract_factories] # Abstract Factory Configuration enable_factory_registry: true enable_factory_caching: true [user_abstract_factory] # User abstract factory factory_interface: "com.example.UserFactory" implementations: { default: "com.example.DefaultUserFactory" premium: "com.example.PremiumUserFactory" admin: "com.example.AdminUserFactory" } factory_methods: { create_user_factory: """ function createUserFactory(type) { switch(type) { case 'premium': return new PremiumUserFactory(); case 'admin': return new AdminUserFactory(); default: return new DefaultUserFactory(); } } """ } [order_abstract_factory] # Order abstract factory factory_interface: "com.example.OrderFactory" implementations: { default: "com.example.DefaultOrderFactory" express: "com.example.ExpressOrderFactory" bulk: "com.example.BulkOrderFactory" } factory_methods: { create_order_factory: """ function createOrderFactory(type) { switch(type) { case 'express': return new ExpressOrderFactory(); case 'bulk': return new BulkOrderFactory(); default: return new DefaultOrderFactory(); } } """ } """; Map<String, Object> config = parser.parse(tskContent); // Initialize abstract factory TuskAbstractFactory abstractFactory = new TuskAbstractFactory(); abstractFactory.configure(config); // Create factories using abstract factory UserFactory userFactory = abstractFactory.createFactory("user_abstract_factory", "create_user_factory", "premium"); OrderFactory orderFactory = abstractFactory.createFactory("order_abstract_factory", "create_order_factory", "express"); // Use factories User user = userFactory.createUser("Premium User", "premium@example.com"); UserDTO userDTO = userFactory.createUserDTO(user); Order order = orderFactory.createOrder(1L, List.of(new OrderItem("Product", 100.0, 2))); OrderDTO orderDTO = orderFactory.createOrderDTO(order); System.out.println("Created premium user: " + userDTO.getName()); System.out.println("Created express order: " + orderDTO.getTotalAmount()); } }

2. Builder Pattern Integration

import org.tusklang.java.TuskLang;
import org.tusklang.java.factory.TuskBuilderFactory;
import java.util.Map;

public class UserBuilder { private String name; private String email; private String role = "user"; private boolean active = true; private java.time.LocalDateTime createdAt = java.time.LocalDateTime.now(); public UserBuilder name(String name) { this.name = name; return this; } public UserBuilder email(String email) { this.email = email; return this; } public UserBuilder role(String role) { this.role = role; return this; } public UserBuilder active(boolean active) { this.active = active; return this; } public UserBuilder createdAt(java.time.LocalDateTime createdAt) { this.createdAt = createdAt; return this; } public User build() { User user = new User(name, email); user.setRole(role); user.setActive(active); user.setCreatedAt(createdAt); return user; } }

public class BuilderFactoryExample { public static void main(String[] args) { TuskLang parser = new TuskLang(); String tskContent = """ [builder_factories] # Builder Factory Configuration enable_fluent_api: true enable_validation: true [user_builder_factory] # User builder factory builder_class: "com.example.UserBuilder" entity_class: "com.example.User" builder_methods: { create_user_builder: """ function createUserBuilder() { return new UserBuilder(); } """ create_admin_builder: """ function createAdminBuilder() { return new UserBuilder() .role("admin") .active(true); } """ create_premium_builder: """ function createPremiumBuilder() { return new UserBuilder() .role("premium") .active(true); } """ } [order_builder_factory] # Order builder factory builder_class: "com.example.OrderBuilder" entity_class: "com.example.Order" builder_methods: { create_order_builder: """ function createOrderBuilder() { return new OrderBuilder(); } """ create_express_order_builder: """ function createExpressOrderBuilder() { return new OrderBuilder() .priority("high") .shipping("express"); } """ } """; Map<String, Object> config = parser.parse(tskContent); // Initialize builder factory TuskBuilderFactory builderFactory = new TuskBuilderFactory(); builderFactory.configure(config); // Create builders using factory UserBuilder userBuilder = builderFactory.createBuilder("user_builder_factory", "create_user_builder"); UserBuilder adminBuilder = builderFactory.createBuilder("user_builder_factory", "create_admin_builder"); // Build entities User user = userBuilder .name("John Doe") .email("john@example.com") .build(); User admin = adminBuilder .name("Admin User") .email("admin@example.com") .build(); System.out.println("Created user: " + user.getName() + " (Role: " + user.getRole() + ")"); System.out.println("Created admin: " + admin.getName() + " (Role: " + admin.getRole() + ")"); } }

🔧 Spring Boot Integration

1. Spring Boot Configuration

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.tusklang.java.TuskLang;
import org.tusklang.java.spring.TuskFactoryConfig;

@SpringBootApplication @Configuration public class FactoryApplication { @Bean public TuskFactoryConfig tuskFactoryConfig() { TuskLang parser = new TuskLang(); return parser.parseFile("factories.tsk", TuskFactoryConfig.class); } public static void main(String[] args) { SpringApplication.run(FactoryApplication.class, args); } }

@TuskConfig public class TuskFactoryConfig { private EntityFactoryConfig entityFactories; private ServiceFactoryConfig serviceFactories; private RepositoryFactoryConfig repositoryFactories; private DTOFactoryConfig dtoFactories; // Getters and setters public EntityFactoryConfig getEntityFactories() { return entityFactories; } public void setEntityFactories(EntityFactoryConfig entityFactories) { this.entityFactories = entityFactories; } public ServiceFactoryConfig getServiceFactories() { return serviceFactories; } public void setServiceFactories(ServiceFactoryConfig serviceFactories) { this.serviceFactories = serviceFactories; } public RepositoryFactoryConfig getRepositoryFactories() { return repositoryFactories; } public void setRepositoryFactories(RepositoryFactoryConfig repositoryFactories) { this.repositoryFactories = repositoryFactories; } public DTOFactoryConfig getDtoFactories() { return dtoFactories; } public void setDtoFactories(DTOFactoryConfig dtoFactories) { this.dtoFactories = dtoFactories; } }

🎯 Best Practices

1. Factory Design Patterns

// ✅ Use appropriate factory patterns
- Simple Factory: For basic object creation
- Factory Method: For complex object creation
- Abstract Factory: For related object families
- Builder: For complex object construction

// ✅ Implement validation in factories - Validate input parameters - Check business rules - Ensure data integrity

// ✅ Use dependency injection - Inject dependencies into factories - Use Spring Boot's DI container - Maintain loose coupling

// ✅ Implement caching strategies - Cache frequently created objects - Use appropriate cache eviction policies - Monitor cache performance

2. Performance Optimization

// 1. Factory Caching
- Cache factory instances
- Cache created objects when appropriate
- Use appropriate cache sizes

// 2. Lazy Initialization - Initialize factories on demand - Use lazy loading for heavy objects - Implement proper cleanup

// 3. Resource Management - Properly manage database connections - Clean up resources after use - Use try-with-resources

// 4. Validation Optimization - Validate early and often - Use efficient validation rules - Cache validation results

🚀 Summary

TuskLang Java model factories provide:

- JPA Entity Factories: Seamless JPA integration with validation - Spring Boot Service Factories: Native Spring Boot service creation - Repository Factories: Custom repository patterns with optimized queries - DTO Factories: Efficient data transfer object creation - Abstract Factory Patterns: Complex object family creation - Builder Pattern Integration: Fluent API for complex object construction - Spring Boot Integration: Native Spring Boot configuration support

With these factory features, your Java applications will achieve enterprise-grade model creation while maintaining the flexibility and power of TuskLang configuration.

"We don't bow to any king" - Build factories like a Java architect with TuskLang!