C++實現工廠模式及解析

工廠模式

1 工廠方法模式

1.1 定義以及作用

通過定義工廠父類負責定義創建對象的公共接口,而子類則負責生成具體的對象。工廠方法使一個類的實例化延遲到其子類,即由子類來決定應該實例化(創建)哪一個類

1.2 特點
  • 克服了簡單工廠的缺點:違背了開放-封閉原則的缺點
  • 工廠方法模式將具體產品的創建推遲到工廠類的子類(具體工廠)中,工廠父類不在負責所有產品的創建,而只是給出具體工廠必須實現的接口。工廠方法模式集中封裝了對象的創建,使得更換對象時,不需要做大的改動即可實現,可看下面的例子。符合開放封閉原則,克服了簡單工廠模式的缺點
1.3 UML類圖

工廠方法模式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類圖如下:
抽象工廠模式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++面向對象編程的特點,使用類的封裝、繼承、多態的特點。降低了客戶程序與產品對象的耦合。

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