欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++設(shè)計(jì)模式之工廠方法模式

 更新時(shí)間:2014年09月30日 12:12:28   作者:果凍想  
這篇文章主要介紹了C++設(shè)計(jì)模式之工廠方法模式,它是對(duì)簡(jiǎn)單工廠模式的擴(kuò)展,,需要的朋友可以參考下

問題描述

之前講到了C++設(shè)計(jì)模式——簡(jiǎn)單工廠模式,由于簡(jiǎn)單工廠模式的局限性,比如:工廠現(xiàn)在能生產(chǎn)ProductA、ProductB和ProductC三種產(chǎn)品了,此時(shí),需要增加生產(chǎn)ProductD產(chǎn)品;那么,首先是不是需要在產(chǎn)品枚舉類型中添加新的產(chǎn)品類型標(biāo)識(shí),然后,修改Factory類中的switch結(jié)構(gòu)代碼。是的,這種對(duì)代碼的修改,對(duì)原有代碼的改動(dòng)量較大,易產(chǎn)生編碼上的錯(cuò)誤(雖然很簡(jiǎn)單,如果工程大了,出錯(cuò)也是在所難免的?。。。?。這種對(duì)代碼的修改是最原始,最野蠻的修改,本質(zhì)上不能稱之為對(duì)代碼的擴(kuò)展。同時(shí),由于對(duì)已經(jīng)存在的函數(shù)進(jìn)行了修改,那么以前進(jìn)行過(guò)的測(cè)試,都將是無(wú)效的,所有的測(cè)試,都將需要重新進(jìn)行,所有的代碼都需要進(jìn)行重新覆蓋。這種,增加成本,不能提高效率的事情,在公司是絕對(duì)不允許的(除非昏庸的PM)。出于種種原因,簡(jiǎn)單工廠模式,在實(shí)際項(xiàng)目中使用的較少。那么該怎么辦?怎么辦呢?需要對(duì)原有代碼影響降到最小,同時(shí)能對(duì)原有功能進(jìn)行擴(kuò)展。

UML類圖

那么今天介紹的工廠方法模式,就隆重登場(chǎng)了。它只是對(duì)簡(jiǎn)單工廠模式的擴(kuò)展,在GOF的介紹中,它們是合并在一起的,而我則是單獨(dú)分開進(jìn)行講解的,就是為了區(qū)分二者的利弊,便于大家在實(shí)際項(xiàng)目中進(jìn)行更好的把握與應(yīng)用。工廠方法模式是在簡(jiǎn)單工廠模式的基礎(chǔ)上,對(duì)“工廠”添加了一個(gè)抽象層。將工廠共同的動(dòng)作抽象出來(lái),作為抽象類,而具體的行為由子類本身去實(shí)現(xiàn),讓子類去決定生產(chǎn)什么樣的產(chǎn)品。

如圖,F(xiàn)actoryA專心負(fù)責(zé)生產(chǎn)ProductA,F(xiàn)actoryB專心負(fù)責(zé)生產(chǎn)ProductB,F(xiàn)actoryA和FactoryB之間沒有關(guān)系;如果到了后期,如果需要生產(chǎn)ProductC時(shí),我們則可以創(chuàng)建一個(gè)FactoryC工廠類,該類專心負(fù)責(zé)生產(chǎn)ProductC類產(chǎn)品。由于FactoryA、FactoryB和FactoryC之間沒有關(guān)系,當(dāng)加入FactoryC加入時(shí),對(duì)FactoryA和FactoryB的工作沒有產(chǎn)生任何影響,那么對(duì)代碼進(jìn)行測(cè)試時(shí),只需要單獨(dú)對(duì)FactoryC和ProductC進(jìn)行單元測(cè)試,而FactoryA和FactoryB則不用進(jìn)行測(cè)試,則可省去大量無(wú)趣無(wú)味的測(cè)試工作。

適用場(chǎng)合

工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。

1.在設(shè)計(jì)的初期,就考慮到產(chǎn)品在后期會(huì)進(jìn)行擴(kuò)展的情況下,可以使用工廠方法模式;

2.產(chǎn)品結(jié)構(gòu)較復(fù)雜的情況下,可以使用工廠方法模式;

由于使用設(shè)計(jì)模式是在詳細(xì)設(shè)計(jì)時(shí),就需要進(jìn)行定奪的,所以,需要權(quán)衡多方面的因素,而不能為了使用設(shè)計(jì)模式而使用設(shè)計(jì)模式。

代碼實(shí)現(xiàn):

/*
** FileName   : FactoryMethodPatternDemo
** Author    : Jelly Young
** Date     : 2013/11/18
** Description : More information, please go to http://www.dbjr.com.cn
*/
 
#include <iostream>
using namespace std;
 
class Product
{
public:
  virtual void Show() = 0;
};
 
class ProductA : public Product
{
public:
  void Show()
  {
    cout<< "I'm ProductA"<<endl;
  }
};
 
class ProductB : public Product
{
public:
  void Show()
  {
    cout<< "I'm ProductB"<<endl;
  }
};
 
class Factory
{
public:
  virtual Product *CreateProduct() = 0;
};
 
class FactoryA : public Factory
{
public:
  Product *CreateProduct()
  {
    return new ProductA ();
  }
};
 
class FactoryB : public Factory
{
public:
  Product *CreateProduct()
  {
    return new ProductB ();
  }
};
 
int main(int argc , char *argv [])
{
  Factory *factoryA = new FactoryA ();
  Product *productA = factoryA->CreateProduct();
  productA->Show();
 
  Factory *factoryB = new FactoryB ();
  Product *productB = factoryB->CreateProduct();
  productB->Show();
 
  if (factoryA != NULL)
  {
    delete factoryA;
    factoryA = NULL;
  }
 
  if (productA != NULL)
  {
    delete productA;
    productA = NULL;
  }
 
  if (factoryB != NULL)
  {
    delete factoryB;
    factoryB = NULL;
  }
 
  if (productB != NULL)
  {
    delete productB;
    productB = NULL;
  }
  return 0;
}

相關(guān)文章

最新評(píng)論