簡單工廠模式
//一般來說,自己創建一個對象的方法是在自己寫的業務函數中直接new一個對象出來
//但是現實需求,我不想創建對象,我只想拿來用。(創建類的步驟比較復雜)
//好處,1、客戶端和具體實現類解耦。2、對于某些對象創建過程比較復雜情況,我們不用考慮這些了。
//壞處,1、簡單工廠模式,增加新的功能是通過源代碼實現的,不符合開閉原則。2、這個類的職責過重,這個類發生問題,會影響很多使用這個工廠模塊。
//抽象水果 class AbstractFruit{ public: virtual void ShowName() = 0; };//蘋果 class Apple:public AbstractFruit{ public:virtual void ShowName(){cout << “我是蘋果!” << endl;}};//鴨梨 class Pear:public AbstractFruit{ public:virtual void ShowName(){cout << “我是鴨梨!” << endl;} };//水果工廠 class FruitFactory{ public:static AbstractFruit* CreateFruit(string flag){if(flag == "apple"){return new Apple;}else if(flag == "pear"){return new Pear;}elsereturn NULL;} };void test1(){FruitFactory* factory = new FruitFactroy;AbstractFruit* apple = factory->CreateFruite("apple");apple->ShowName();AbstracFruit* banana = factory->CreateFruite("banana");banana->ShowName();delete factory;delete apple;delete banana;}
?
工廠方法模式
問題,1、類的個數成倍增加,導致類越來越多,增加維護成本。
? ? 好處,1、符合開閉原則
簡單工廠模式 + “開閉原則” = 工廠方法模式
?
優點:1,不需要記住具體類名,甚至連具體參數都不用記憶。
2,實現了對象創建和使用的分離。
? ? 3,系統的可擴展性也就變得非常好,無需修改接口和原類。
缺點:1,增加系統中類的個數,復雜度和理解度增加。
? ? ? ? ? ?2,增加了系統的抽象性和理解難度。
//抽象水果類
class AbstractFruit{ public: virtual void ShowName() = 0; };//蘋果 class Apple:public AbstractFruit{ public:virtual void ShowName(){cout << “我是蘋果!” << endl;}};//鴨梨 class Pear:public AbstractFruit{ public:virtual void ShowName(){cout << “我是鴨梨!” << endl;} };
//抽象工廠類
class AbstractFruitFactory{
public:
virtual AbstractFruit* CreateFruit() = 0;
}
//蘋果工廠
class AppleFactory:public AbstractFruitFactory{
public:
virtual AbstracFruit* CreateFruit(){
return new Apple;
}
};
//鴨梨工廠
class PearFactory:public AbstractFruitFactory{
public:
virtual AbstracFruit* CreateFruit(){
return new Pear;
}
};
void test(){
AbstractFruitFactory* factory = NULL;
AbstractFruit* fruit = NULL;
//創建一個蘋果工廠
factory = new AppleFactory;
fruit = factory->CreateFruit();
fruit->ShowName();
delete factory;
delete fruit;
//創建一個鴨梨工廠
factory = new PearFactory;
fruit = factory->CreateFruit();
fruit->ShowName();
delete factory;
delete fruit;
}
?
簡單工廠模式和工廠方法模式適用場景
簡單工廠模式:
1,工廠類負責創建的對象比較少,由于創建的對象較少,不會造成工廠方法中的業務邏輯太過復雜。
2,客戶端只知道傳入工廠類的參數,對于如何創建對象不太關心。
工廠方法模式
1,客戶端不知道它所需要的對象的類。
2,抽象工廠類通過其子類來指定創建哪個對象。
?
抽象工廠模式
抽象工廠針對的是產品族,而不是產品等級結構。產品族:同一產地或者同一廠商,功能不同。產品等級:功能相同,產地或者廠商不同。
//抽象蘋果 class AbstractApple{ public:virtual void ShowName() = 0; };class ChineseApple:public AbstractApple{ public:virtual void ShowName(){cout << "中國蘋果" << endl;} };//美國蘋果 class USAApple:public AbstractApple{ public:virtual void ShowName(){cout << "美國蘋果" << endl;} };//日本蘋果 class JapaneseApple:public AbstractApple{ public:virtual void ShowName(){cout << "日本蘋果" << endl;} };//抽象香蕉 class AbstractBanana{ public:virtual void ShowName() = 0; };//中國香蕉 class ChineseBanana:public AbstractBanana{ public:virtual void ShowName(){cout << "中國香蕉" << endl;} };//美國香蕉 class USABanana:public AbstractBanana{ public:virtual void ShowName(){cout << "美國香蕉" << endl;} };//日本香蕉 class JapaneseBanana:public AbstractBanana{ public:virtual void ShowName(){cout << "日本香蕉" << endl;} };//抽象工廠 針對產品族 class AbstractFactory{ public:virtual AbstractApple* CreateApple() = 0;virtual AbstractBanana* CreateBanana() = 0;virtual AbstractPear* CreatePear() = 0; };//中國工廠 class ChineseFactory:public AbstracFactory{ public:virtual AbstractApple* CreateApple() {return new ChineseApple;}virtual AbstractBanana* CreateBanana(){return new ChineseBanana;}virtual AbstractPear* CreatePear(){return new ChinesePear;} };//美國工廠 class USAFactory:public AbstracFactory{ public:virtual AbstractApple* CreateApple() {return new USAApple;}virtual AbstractBanana* CreateBanana(){return new USABanana;}virtual AbstractPear* CreatePear(){return new USAPear;} };//日本工廠 class JapaneseFactory:public AbstracFactory{ public:virtual AbstractApple* CreateApple() {return new JapaneseApple;}virtual AbstractBanana* CreateBanana(){return new JapaneseBanana;}virtual AbstractPear* CreatePear(){return new JapanesePear;} };test(){AbstractFactory* factory = NULL;AbstractApple* apple = NULL;AbstractBanana* banana = NULL:AbstractPear* pear = NULL;//中國工廠factory = new ChineseFactory; apple = factory->CreateApple();banana = factory->CreateBanana();pear = factory->CreatePear();}
?
總結
一、簡單工廠模式
我們在實例化對象的時候通常用的式New關鍵字,但是有了工廠,我們在聲明對象的時候就可以用工廠了,用new導致代碼不夠靈活,用工廠來實例化對象很靈活。
優點,1,簡單工廠包含必要的判斷邏輯,簡單工廠實現了對象的創建和使用的分離。
2,客戶端無需知道所創建的具體產品類的類名,只需要具體產品類對應的參數即可。
3,在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
缺點,1,工廠類的職責過重,簡單工廠中包含邏輯判斷語句,他一旦有問題,整個系統都要出問題。
2,在添加新類的時候,簡單工廠就要修改,違反了開閉原則。
?
二、工廠方法模式
工廠方法式簡單工廠的進一步的延申,這樣說是因為簡單工廠違反了開閉原則,而工廠方法可以完美解決這個問題。
優點,1,工廠方法用來創建類,同時隱藏了具體產品類被實例化的細節,用戶只需要關注工廠,不需要關注創建的細節。
2,再增加新的運算類時不需要修改代碼,只需要增加對應的工廠即可。符合開閉原則。
缺點,1,再增加新的類時,也必須增加新的工廠類,會帶來額外的開銷
2,抽象層的加入使得理解難度加大。
?
三、抽象工廠
抽象工廠模式是工廠方法的進一步延伸,由于它提供了功能更為強大的工廠類并且具備較好的可擴展性。
有缺點:抽象工廠模式增加一個產品族很簡單,但是增加一個新的產品就會非常復雜。
?