二十三種設計模式——工廠模式

二十三種設計模式——工廠模式

簡單工廠模式

         簡單工廠模式又稱靜態工廠方法(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、增加功能時可以不用改變原有的程序。並且可以增加一些複雜的功能

是否滿足可複用性和可擴展性:

滿足可複用性與可維護性:因爲每個產品與工廠都獨立,所以需要哪個就直接使用就可以了,所以滿足複用。可維護性:因爲增加了工廠類,每一個工廠生產每一類產品。就算增加了,只需要在增加工廠就可以了。維護性好。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章