Design Patterns
Introduction to Function Design Patterns
Function design patterns are reusable solutions to common programming challenges. They help create more efficient, maintainable, and scalable code.
Common Function Design Patterns
1. Factory Pattern
class AnimalFactory:
@staticmethod
def create_animal(animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
else:
raise ValueError("Unknown animal type")
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
## Usage
animal = AnimalFactory.create_animal("dog")
print(animal.speak()) ## Output: Woof!
2. Decorator Pattern
def log_function(func):
def wrapper(*args, **kwargs):
print(f"Calling function: {func.__name__}")
result = func(*args, **kwargs)
print(f"Function {func.__name__} completed")
return result
return wrapper
@log_function
def calculate_square(x):
return x ** 2
print(calculate_square(5))
Function Design Pattern Categories
Category |
Purpose |
Key Characteristics |
Creational |
Object Creation |
Flexible instantiation |
Structural |
Composition |
Simplified complex structures |
Behavioral |
Communication |
Efficient interaction |
Singleton Pattern Implementation
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
## Usage
instance1 = Singleton()
instance2 = Singleton()
print(instance1 is instance2) ## Output: True
Strategy Pattern
class PaymentStrategy:
def pay(self, amount):
pass
class CreditCardPayment(PaymentStrategy):
def pay(self, amount):
return f"Paid {amount} using Credit Card"
class PayPalPayment(PaymentStrategy):
def pay(self, amount):
return f"Paid {amount} using PayPal"
class PaymentProcessor:
def __init__(self, strategy):
self._strategy = strategy
def process_payment(self, amount):
return self._strategy.pay(amount)
## Usage
credit_payment = PaymentProcessor(CreditCardPayment())
print(credit_payment.process_payment(100))
Function Design Flow Visualization
graph TD
A[Start Design] --> B{Identify Problem}
B --> C[Choose Appropriate Pattern]
C --> D[Implement Pattern]
D --> E{Test Implementation}
E --> |Successful| F[Refine and Optimize]
E --> |Issues| C
F --> G[Deploy]
Advanced Composition Techniques
def compose(*functions):
def inner(arg):
result = arg
for func in reversed(functions):
result = func(result)
return result
return inner
def double(x):
return x * 2
def increment(x):
return x + 1
composed_func = compose(double, increment)
print(composed_func(3)) ## Output: 8
Best Practices
- Keep functions focused and modular
- Use design patterns judiciously
- Prioritize readability
- Test thoroughly
Conclusion
Mastering function design patterns with LabEx can significantly improve your Python programming skills, enabling more elegant and efficient code solutions.