簡單工廠與工廠模式
什麼是簡單工廠模式
簡單工廠模式屬於類的建立型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。
模式中包含的角色及其職責
1.工廠(Creator)角色 簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類可以被外界直接呼叫,建立所需的產品物件。 2.抽象(Product)角色 簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。 3.具體產品(Concrete Product)角色 簡單工廠模式所建立的具體例項物件
//依賴: 一個類的物件 當另外一個類的函式引數 或者是 返回值
簡單工廠模式的優缺點 在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的物件。使用者在使用時可以直接根據工廠類去建立所需的例項,而無需瞭解這些物件是如何建立以及如何組織的。有利於整個軟體體系結構的優化。不難發現,簡單工廠模式的缺點也正體現在其工廠類上,
由於工廠類集中了所有例項的建立邏輯,所以“高內聚”方面做的並不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴充套件性並不很好。
程式碼實現
include "iostream"
using namespace std;
//思想: 核心思想是用一個工廠,來根據輸入的條件產生不同的類,然後根據不同類的virtual函式得到不同的結果。
//元素分析:
//抽象產品類:水果類
//具體的水果了:香蕉類、蘋果類、梨子
//優點 適用於不同情況建立不同的類時
//缺點 客戶端必須要知道基類和工廠類,耦合性差 增加一個產品,需要修改工廠類
class Fruit
{
public:
virtual void getFruit() = 0;
protected:
private:
};
class Banana : public Fruit
{
public:
virtual void getFruit()
{
cout<<"香蕉"<<endl;
}
protected:
private:
};
class Pear : public Fruit
{
public:
virtual void getFruit()
{
cout<<"梨子"<<endl;
}
protected:
private:
};
class Factory
{
public:
static Fruit* Create(char *name)
{
Fruit *tmp = NULL;
if (strcmp(name, "pear") == 0)
{
tmp = new Pear();
}
else if (strcmp(name, "banana") == 0)
{
tmp = new Banana();
}
else
{
return NULL;
}
return tmp;
}
protected:
private:
};
void main41()
{
Fruit *pear = Factory::Create("pear");
if (pear == NULL)
{
cout<<"建立pear失敗\n";
}
pear->getFruit();
Fruit *banana = Factory::Create("banana");
banana->getFruit();
system("pause");
}
工廠模式
概念 工廠方法模式同樣屬於類的建立型模式又被稱為多型工廠模式 。工廠方法模式的意義是定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。 核心工廠類不再負責產品的建立,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
類圖角色和職責 抽象工廠(Creator)角色 工廠方法模式的核心,任何工廠類都必須實現這個介面。 具體工廠( Concrete Creator)角色 具體工廠類是抽象工廠的一個實現,負責例項化產品物件。 抽象(Product)角色 工廠方法模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。 具體產品(Concrete Product)角色 工廠方法模式所建立的具體例項物件
工廠方法模式和簡單工廠模式比較 工廠方法模式與簡單工廠模式在結構上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。 工廠方法模式之所以有一個別名叫多型性工廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。 當系統擴充套件需要新增新的產品物件時,僅僅需要新增一個具體物件以及一個具體工廠物件,原有工廠物件不需要進行任何修改,也不需要修改客戶端,很好的符合了“開放-封閉”原則。而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。工廠方法模式退化後可以演變成簡單工廠模式。
#include <iostream>
using namespace std;
class Fruit
{
public:
virtual void sayname() = 0;
};
class Banana : public Fruit
{
public:
void sayname()
{
cout << "我是香蕉" << endl;
}
};
class Apple : public Fruit
{
public:
void sayname()
{
cout << "我是 Apple" << endl;
}
};
class AbFactory
{
public:
virtual Fruit *CreateProduct() = 0;
};
class BananaFactory :public AbFactory
{
public:
virtual Fruit *CreateProduct()
{
return new Banana;
}
};
class AppleFactory :public AbFactory
{
public:
virtual Fruit *CreateProduct()
{
return new Apple;
}
};
//////////////////////////////////////////////////////////////////////////
//新增新的產品
class Pear : public Fruit
{
public:
virtual void sayname()
{
cout << "我是 pear" << endl;
}
protected:
private:
};
class PearFactory : public AbFactory
{
public:
virtual Fruit *CreateProduct()
{
return new Pear;
}
};
void main()
{
AbFactory *factory = NULL;
Fruit *fruit = NULL;
//吃 香蕉
factory = new BananaFactory;
fruit = factory->CreateProduct();
fruit->sayname();
delete fruit;
delete factory;
//Pear
factory = new PearFactory;
fruit = factory->CreateProduct();
fruit->sayname();
delete fruit;
delete factory;
cout<<"hello..."<<endl;
system("pause");
return ;
}