2013-01-21 114 views
2

我必須根據客戶類型創建對象族。 我有一個基本的抽象類ApplicationRulesFactory,它定義了 虛擬接口。許多具體的客戶類從這個類繼承。具有默認實現的抽象工廠設計模式

問題是,對於某些客戶說CustomerB我們不使用對象Rule2和Rule3,因爲應用程序中使用這些對象Rule2和Rule3的功能在該客戶的應用程序用戶界面中被禁用,所以我們根本不需要實例化這些對象。

簡化的代碼是在這裏,即在現實ApplicationRulesFactory有更多的虛方法,並且更具體的客戶分類,從它繼承:

class ApplicationRulesFactory 
{ 
    virtual Rule1* GetRule1() = 0; 
    virtual Rule2* GetRule2() = 0; 
    virtual Rule3* GetRule3() = 0; 
    ..... 
}; 

class ACustomerRulesFactory : public ApplicationRulesFactory 
{ 
    Rule1* GetRule1() 
    { 
    return new ACustomerRule1(); 
    } 

    Rule2 * GetRule2() 
    { 
    return new ACustomerRule2(); 
    } 

Rule3* GetRule3() 
{ 
    return new ACustomerRule3(); 
} 
}; 

class BCustomerRulesFactory : public ApplicationRulesFactory 
{ 
    Rule1* GetRule1() 
    { 
     return new BCustomerRule1(); 
    } 
    Rule2* GetRule2() // not needed 
    { 
     // what to return here ? 
    } 
    Rule3* GetRule3() // not needed 
    { 
    // what to return here ? 
    } 
}; 

所以,我應該如何去實現這一點:

1)在基類ApplicationRulesFactory中返回一些默認實現:

class ApplicationRulesFactory 
{ 
    virtual Rule1* GetRule1() = 0; 
    virtual Rule2* GetRule2() { return new Rule2DefaultImpl();} 
    virtual Rule3* GetRule3() { return new Rule3DefaultIml();} 
}; 

但是這似乎是錯誤的,要繼承新類(Rule1D eruptImpl,Rule2DefaultImpl)Rule1,Rule2,並且很可能使它們只用於執行空白的目的,就像ApplicationRulesFactory中的默認實現一樣。2)或者在具體類中返回默認實現並保留這些方法純虛擬在基類

class BCustomerRulesFactory : public ApplicationRulesFactory 
{ 
    Rule1* GetRule1() 
    { 
    return new BCustomerRule1(); 
    } 

    Rule2* GetRule2() 
    { 
    return new Rule2DefaultImpl(); 
    } 

Rule3* GetRule3() 
{ 
    return new Rule3DefaultImpl(); 
} 
}; 

這些解決方案也似乎很醜陋,重新定義在每一個具體的客戶類中的方法,雖然他們不需要。我也有一種感覺,也許我不應該這樣使用繼承,因爲這違反了IS-A的繼承規則,導致大量的方法不適用於所有具體的客戶類,但是如果沒有繼承,不要去實現這個。

任何想法

+0

他們的指針,你能不能只返回NULL?在設計方面,客戶A和B是不同類型的客戶,因此可能會有兩個子類,一個規則是一個,另一個是3. – parkydr

+0

是的,我可以,但仍然懷疑這是正確的做法。 – user152508

回答

0

如果不能被使用的規則,我會建議只是從一個基類實現(主要是喜歡你的選項中返回一個空指針除了不因默認實現困擾,因爲它永遠是所謂的)。

1

你似乎在將界面和工廠混合成一個。當然,接口本身應該是一個類,有各種規則,它們在基類中具有默認行爲,然後在派生類中重寫行爲,然後工廠返回一個指向所請求的類的指針,以實現正確的規則對於那種情況。

但也許我誤解你想達到什麼目的?

+0

對不起,我聽不懂你,你的意思混合接口和工廠合爲一體。 – user152508

+0

一個典型的工廠函數是返回來自許多類[與相同的基類相關並提供相同接口]的對象的東西。你給它一個「選擇標準」,並選擇合適的課程來創建。返回的對象表示所選類型的實現 - 例如「適用於本案的規則」。因此,在這種情況下,您需要輸入「客戶類型」,然後在一個對象中取回適用於該客戶的規則。但我仍然不能100%確定我明白你想要實際做什麼。 –

4

如果ApplicationRulesFactory沒有意義的某些種類的Customers,那麼它是不是適合你的抽象。

您的域名knows情理之中的事情,所以爲什麼會被要求Rule2Rule3

使知道它只需要的對象Rule1使用工廠只給它Rule1。給它一個上下文,以便它可以得到它需要的工廠。