2016-11-08 43 views
0

我想重構一些代碼。目前該代碼遵循如下模式:使用堆分配而不是工廠方法的堆分配

function f() { 
Transaction trans; 
// Do Operation 
trans.commit(); 
} 

這裏的事務是具體的類。我想將它移動到Interface並使此代碼如下所示:

function f() { 
ITransaction* trans = GetTransaction(); 
// Do Operation 
trans->commit(); 
} 

// Factory 
ITransaction* GetTransaction() 
{ 
return new Transaction(); 
} 

問題:我們開始在工廠方法中使用new,現在使堆分配。我想避免這種堆分配,並仍然設法使用接口。 有什麼辦法可以做到這一點?

感謝, 凱拉斯

+1

自定義分配器應該可以解決大部分,如果並非所有的性能問題。我也建議使用'std :: unique_ptr',這樣你的例子不會泄漏。 – StoryTeller

+2

「我想避免這樣的堆分配」 - 堆分配的哪個方面困擾着你? –

+1

如果事務類型的數量是固定的,請查看* variant *類型,例如'提振:: variant'。 – juanchopanza

回答

1

你可以做的是一樣的東西在堆棧分配工廠類。

void function() { 
    Factory factory{}; 
    auto transaction = factory.getTransaction(arguments...); 
} 

廠可以看起來像:

class Factory { 
    A aTransaction; 
    B bTransaction; 
    C correctTransaction; 

    transactionBase* getTransaction(arguments...) { 
     //return one member based on arguments 
    } 
} 

但是,如果你的論點允許模板,它變得更容易一點像做

void function() { 
    Factory<Arguments...> transaction; 
}