原廠模式(c++描述)

來源:互聯網
上載者:User

    接著前面所述簡單原廠模式,簡單原廠模式符合物件導向4大原則:可維護,可複用,可擴充,靈活性高,耦合度低,但是他仍然有一個很

 

大的問題就是如果要增加新的產品,必須對工廠進行修改,這就違背了軟體設計的開閉原則 。

 

   對於這種問題,我們可以使用原廠模式來解決。

 

    假設我們想要增加一個新的運算乘方運算類,我們可以按如下思想來設計:

 

 

設計基於運算基類的乘方類,這和簡單原廠模式相同,但在設計工廠的時候,我們把他的加工產品的方式分類,並且設計一個總廠(工廠基

 

類),這樣,我們需要產品的時候,只需要向總廠請求,總廠讓分廠來生產產品,如果有新的產品需要加工,只需設計一個新的工廠來加工

 

新產品就可以了,不需要對原廠變更。

 

 實現代碼:

這裡繼續引用簡單原廠模式中的計算機類,對於原有的產品(運算類和運算基類)我們不做更改,我們只設計新的工廠;

//乘方類

#ifndef OPERATIONPOWER
#define OPERATIONPOWER

class OperationPower:public Operation
{

public:double GetResult(double numA, double numB);

};
#endif

 

//基類工廠

#ifndef FACTORY
#define FACTORY

class Factory
{

public:virtual Operation * CreateOperation(char operate);

};

#endif

//原有的基礎運算基類

#ifndef FACTORY1
#define FACTORY1

class Factory1:public Factory
{
public:Operation *CreateOperation(char operate);

};

#endif

//運算基類實現

Operation *Factory1::CreateOperation(char operate)
{
 std::cout<<"It is the Factory1!"<<std::endl;

 Operation *oper = NULL;
 
 switch(operate)
 {
 case '+':oper = new OperationAdd();
  break;
 case '-':oper = new OperationSub();
  break;
 case '*':oper = new OperationMul();
  break;
 case '/':oper = new OperationDiv();
  break;
 
 default:  std::cout<<"The Operation is Error!"<<std::endl;
  oper = new Operation();
  break;
 }

 return oper;
}

 

//新增加乘方運算處理工廠

#ifndef FACTORYNEW1
#define FACTORYNEW1

class FactoryNew1:public Factory
{
public:Operation *CreateOperation(char operate);

};

#endif

//處理工廠實現

Operation *FactoryNew1::CreateOperation(char operate)
{
 std::cout<<"It is a New Factory!/n";

 Operation *oper = NULL;
 switch(operate)
 {
 case '^':oper = new OperationPower();
  break;
 case 'e':exit(0);
  break;
  
 default:
  std::cout<<"The Operation is Error!"<<std::endl;
  oper = new Operation();
  break;
 }

 return oper;
}

//用戶端實現

int main(void)
{
 Factory *p = new Factory1();
 Operation *oper = p->CreateOperation('+');

 double result = 0;
 double numA = 20;
 double numB = 4;

 

 result = oper->GetResult(numA, numB);

 std::cout<<"numA + numB 's result is:"<<result<<"/n";

 delete p;
 delete oper;

 p = new FactoryNew1();
 oper = p->CreateOperation('^');

 result = oper->GetResult(numA, numB);

 std::cout<<"numA ^ numB 's result is:"<<result<<"/n";

 system("pause");

 return 0;
}

 

說明:

/*
*優點:彌補了簡單工程模式的不足,擴充新的產品不在需要改動工廠,可直接設計子工廠就可完成
*缺點:對創造不同系列的新產品無能為力
*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.