工廠模式
1 工廠方法模式
1.1 定義以及作用
通過定義工廠父類負責定義創建對象的公共接口,而子類則負責生成具體的對象。工廠方法使一個類的實例化延遲到其子類,即由子類來決定應該實例化(創建)哪一個類
1.2 特點
- 克服了簡單工廠的缺點:違背了開放-封閉原則的缺點
- 工廠方法模式將具體產品的創建推遲到工廠類的子類(具體工廠)中,工廠父類不在負責所有產品的創建,而只是給出具體工廠必須實現的接口。工廠方法模式集中封裝了對象的創建,使得更換對象時,不需要做大的改動即可實現,可看下面的例子。符合開放封閉原則,克服了簡單工廠模式的缺點
1.3 UML類圖
工廠方法模式UML類圖如下:
1.4 步驟流程
步驟1:創建抽象產品類 ,定義具體產品的公共接口;
步驟2:創建具體產品類(繼承抽象產品類), 定義生產的具體產品;
步驟3:創建抽象工廠類,定義具體工廠的公共接口;
步驟4:創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例方法;
步驟5:客戶端通過調用具體工廠類的方法,從而創建不同具體產品類的實例
1.5 代碼實現
背景:假設某大型工廠(抽象工廠類)承接汽車(抽象產品類)組裝,其任務爲根據客戶圖紙要求組裝對應的汽車。其子工廠A(具體工廠類)組裝A型汽車(具體產品類),子工廠B(具體工廠類)組裝B型汽車(具體產品類),對應不同客戶的要求,去不同的工廠組裝,即下面Factory *factory = new ConcreteFactoryB()
的改變。
C++實現代碼如下:
// Product
// 創建抽象產品類,定義具體產品的公共接口
class Car {
public:
virtual ~Car() { }
virtual void Order() = 0;
};
//創建具體產品類(繼承抽象產品類),定義生產的具體產品
class Car_A :public Car {
public:
Car_A() {
std::cout << "produce Car_A..." << endl;
}
void Order() {
std::cout << "number of Car_A is 100..." << endl;
}
~Car_A() { }
};
class Car_B :public Car {
public:
Car_B() {
std::cout << "produce Car_B..." << endl;
}
void Order() {
std::cout << "number of Car_B is 200..." << endl;
}
~Car_B() { }
};
// Factory
// 創建抽象工廠類,定義具體的工廠的公共接口
class Factory {
public:
virtual Car* CreateProduct() = 0;
virtual ~Factory() { }
protected:
Factory() { }
};
//創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例方法
class ConcreteFactoryA :public Factory {
public:
ConcreteFactoryA() {
std::cout << "ConcreteFactory Produce Car_A..." << endl;
}
~ConcreteFactoryA() { }
Car* CreateProduct() {
return new Car_A();
}
};
class ConcreteFactoryB :public Factory {
public:
ConcreteFactoryB() {
std::cout << "ConcreteFactory Produce Car_B..." << endl;
}
~ConcreteFactoryB() { }
Car* CreateProduct() {
return new Car_B();
}
};
//test
int main() {
//通過調用具體工廠類的方法,從而創建不同具體產品類的實例
//客戶不同的要求交給不同的工廠生產不同的汽車,這裏改爲工廠B即可生產B汽車
Factory *factory = new ConcreteFactoryB();
//生產汽車
Car *car = factory->CreateProduct();
//汽車訂單的數量
car->Order();
delete factory;
delete car;
return 0;
}
2 抽象工廠模式
2.1 定義以及作用
提供一個創建一系列相關或相互依賴對象的接口,而無需指定其具體的類。具體的工廠(可理解爲生產線)負責實現具體的產品實例。
抽象工廠模式與工廠方法模式的區別:抽象工廠中一個工廠有多條生產線可生產多種產品;而工廠方法一個工廠只能生產一種產品。
2.2 特點
客服了工廠方法模式中,每個工廠只能創建一類產品的缺點
2.3 UML類圖
抽象工廠模式UML類圖如下:
2.4 步驟流程
步驟1:創建抽象產品類 ,定義具體產品的公共接口;
步驟2:創建具體產品類(繼承抽象產品類), 定義生產的具體產品;
步驟3:創建抽象工廠類,定義具體產品的創建接口;
步驟4:創建具體工廠類(繼承抽象工廠類),定義具體生產線生產具體的產品;
步驟5:客戶端通過調用具體工廠類的不同生產線,從而創建不同具體產品類的實例
2.5 代碼實現
背景:還是上例中的汽車組裝工廠,考慮到擴建工廠的成本,週期長,一個工廠只能生產一種類型的汽車,效率較低(工廠方法的每個工廠只能創建一類產品的缺點),因此選擇在工廠中增加生產線,即一個工廠可根據需要生產不同的汽車。
C++實現代碼如下:
// Product
// 創建抽象產品類,定義具體產品的公共接口
class Car {
public:
virtual ~Car() { }
virtual void Order() = 0;
};
//創建具體產品類(繼承抽象產品類),定義具體產品
class Car_A :public Car {
public:
void Order() {
std::cout << "number of Car_A is 100..." << endl;
}
};
class Car_B :public Car {
public:
void Order() {
std::cout << "number of Car_B is 200..." << endl;
}
};
// Factory
// 創建抽象工廠類,工廠中有多條生產線
class AbstractFactory {
public:
virtual ~AbstractFactory() { }
virtual Car* CreateCar_A() = 0;
virtual Car* CreateCar_B() = 0;
};
//創建具體工廠類(繼承抽象工廠類),定義具體生產線的生產具體的產品
class ConcreteFactory :public AbstractFactory {
public:
Car* CreateCar_A() {
return new Car_A();
}
Car* CreateCar_B() {
return new Car_B();
}
};
//test
int main() {
//客戶不同的要求交給工廠生產不同的汽車,**這裏只有一個工廠**
AbstractFactory *factory = new ConcreteFactory();
//不同的生產線生產不同的汽車
Car *car_A = factory->CreateCar_A();
Car *car_B = factory->CreateCar_B();
//汽車訂單的數量
car_A->Order();
car_B->Order();
delete factory;
delete car_A;
delete car_B;
return 0;
}
工廠模式充分利用了C++面向對象編程的特點,使用類的封裝、繼承、多態的特點。降低了客戶程序與產品對象的耦合。