diff --git a/SawCut/Nesting/EngineFactory.cs b/SawCut/Nesting/EngineFactory.cs
new file mode 100644
index 0000000..6e66b2b
--- /dev/null
+++ b/SawCut/Nesting/EngineFactory.cs
@@ -0,0 +1,19 @@
+namespace SawCut.Nesting
+{
+ ///
+ /// Default implementation of IEngineFactory that creates AdvancedFitEngine instances.
+ /// Can be extended to support different engine types based on configuration.
+ ///
+ public class EngineFactory : IEngineFactory
+ {
+ public IEngine CreateEngine(double stockLength, double spacing, int maxBinCount)
+ {
+ return new AdvancedFitEngine
+ {
+ StockLength = stockLength,
+ Spacing = spacing,
+ MaxBinCount = maxBinCount
+ };
+ }
+ }
+}
diff --git a/SawCut/Nesting/IEngineFactory.cs b/SawCut/Nesting/IEngineFactory.cs
new file mode 100644
index 0000000..8b0f0ab
--- /dev/null
+++ b/SawCut/Nesting/IEngineFactory.cs
@@ -0,0 +1,18 @@
+namespace SawCut.Nesting
+{
+ ///
+ /// Factory interface for creating bin packing engines.
+ /// Allows for dependency injection and testing without hard-coded engine types.
+ ///
+ public interface IEngineFactory
+ {
+ ///
+ /// Creates a configured engine instance for bin packing.
+ ///
+ /// The length of stock bins
+ /// The spacing/kerf between items
+ /// Maximum number of bins to create
+ /// A configured IEngine instance
+ IEngine CreateEngine(double stockLength, double spacing, int maxBinCount);
+ }
+}
diff --git a/SawCut/Nesting/MultiBinEngine.cs b/SawCut/Nesting/MultiBinEngine.cs
index 836c37e..bec2c34 100644
--- a/SawCut/Nesting/MultiBinEngine.cs
+++ b/SawCut/Nesting/MultiBinEngine.cs
@@ -6,6 +6,17 @@ namespace SawCut.Nesting
{
public class MultiBinEngine : IEngine
{
+ private readonly IEngineFactory _engineFactory;
+
+ public MultiBinEngine() : this(new EngineFactory())
+ {
+ }
+
+ public MultiBinEngine(IEngineFactory engineFactory)
+ {
+ _engineFactory = engineFactory ?? throw new ArgumentNullException(nameof(engineFactory));
+ }
+
public List Bins { get; set; }
public double Spacing { get; set; }
@@ -23,11 +34,8 @@ namespace SawCut.Nesting
foreach (var bin in bins)
{
- var e = new AdvancedFitEngine();
- e.MaxBinCount = bin.Quantity;
- e.StockLength = bin.Length;
- e.Spacing = Spacing;
- var r = e.Pack(remainingItems);
+ var engine = _engineFactory.CreateEngine(bin.Length, Spacing, bin.Quantity);
+ var r = engine.Pack(remainingItems);
result.AddBins(r.Bins);
remainingItems = r.ItemsNotUsed.ToList();