☕ 🏭 Model Factories in TuskLang Java
🏭 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!