二十三種設計模式——工廠模式
簡單工廠模式
簡單工廠模式又稱靜態工廠方法(StaticFactory Method)模式,不屬於23種模式之一。
簡單工廠模式是工廠模式最簡單使用的模式。
類圖:
程序:
#include <iostream>
#include<string>
using namespace std;
class NationalFlag//父類
{
public:
NationalFlag(){}
~NationalFlag(){}
virtual void display()const = 0;
};
class ChinaFlag:public NationalFlag//子類中國國旗
{
public:
ChinaFlag()
{
cout<<"生產中國國旗"<<endl;
}
~ChinaFlag(){}
void display() const
{
cout<<"中國國旗完成"<<endl;
//cout<<"長:"<<length<<"寬:"<<width<<endl;
}
};
class UsaFlag:public NationalFlag//子類美國國旗
{
public:
UsaFlag()
{
cout<<"正在生產美國國旗"<<endl;
}
void display() const
{
cout<<"美國國旗完成"<<endl;
//cout<<"長:"<<length<<"寬:"<<width<<endl;
}
};
class factory//簡單工廠
{
public:
static NationalFlag *createFlag(string type)
{
if(type=="USA")
{
return new UsaFlag();
}
else if(type=="china")
{
return new ChinaFlag();
}
return NULL;
}
};
int main()
{
NationalFlag *n=NULL;
n=factory::createFlag("china");
n->display();
delete n;
n=NULL;
//cout << "Hello world!" << endl;
return 0;
}
是否滿足開閉原則:
遵循開閉原則設計出的模塊具有兩個主要特徵:
(1)對於擴展是開放的(Open for extension)。這意味着模塊的行爲是可以擴展的。當應用的需求改變時,我們可以對模塊進行擴展,使其具有滿足那些改變的新行爲。也就是說,我們可以改變模塊的功能。
(2)對於修改是關閉的(Closed for modification)。對模塊行爲進行擴展時,不必改動模塊的源代碼或者二進制代碼。模塊的二進制可執行版本,無論是可鏈接的庫、DLL或者.EXE文件,都無需改動。
一部分滿足開閉原則:1、增加功能時可以不用改變原有的程序。2、但是想增加一些複雜的功能變得非常困難。
是否滿足可複用性和可擴展性:
滿足可複用性、不滿足可維護性:因爲簡單工廠中都是模塊與模塊之間聯繫,所以可複用性比較好。當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利。
工廠模式:
類圖:
程序
#include <iostream>
#include<string>
using namespace std;
class NationalFlag//父類
{
public:
NationalFlag(){}
~NationalFlag(){}
virtual void display()const = 0;
};
class ChinaFlag:public NationalFlag//子類中國國旗
{
public:
ChinaFlag()
{
cout<<"生產中國國旗"<<endl;
}
~ChinaFlag(){}
void display() const
{
cout<<"中國國旗完成"<<endl;
//cout<<"長:"<<length<<"寬:"<<width<<endl;
}
};
class UsaFlag:public NationalFlag//子類美國國旗
{
public:
UsaFlag()
{
cout<<"正在生產美國國旗"<<endl;
}
void display() const
{
cout<<"美國國旗完成"<<endl;
//cout<<"長:"<<length<<"寬:"<<width<<endl;
}
};
class factory//簡單工廠
{
public:
factory(){}
~factory(){}
virtual NationalFlag *createFlag(string type) const=0;
};
class chinaFactory: public factory
{
public:
chinaFactory(){cout<<"中國國旗工廠"<<endl;}
~chinaFactory(){}
NationalFlag * createFlag(string type) const
{
return new ChinaFlag();
}
};
class UsaFactory:public factory
{
public:
UsaFactory(){cout<<"美國國旗工廠"<<endl;}
~UsaFactory(){}
NationalFlag * createFlag(string type) const
{
return new UsaFlag();
}
};
int main()
{
factory * f=NULL;
f=new chinaFactory();
NationalFlag *n=f->createFlag("中國");
n->display();
//cout << "Hello world!" << endl;
return 0;
}
是否滿足開閉原則:
滿足開閉原則:1、增加功能時可以不用改變原有的程序。並且可以增加一些複雜的功能
是否滿足可複用性和可擴展性:
滿足可複用性與可維護性:因爲每個產品與工廠都獨立,所以需要哪個就直接使用就可以了,所以滿足複用。可維護性:因爲增加了工廠類,每一個工廠生產每一類產品。就算增加了,只需要在增加工廠就可以了。維護性好。