工廠方法模式(Factory Method)
工廠方法模式(Factory Method)[Virtual Constructor]
意圖:定義一個用於創建對象的接口,讓子類決定實例化哪一個類,使一個類的實力化延遲到子類。
應用:多文檔應用管理不同類型的文檔。
模式結構:
心得:
面對同一繼承體系(Product派生)的類,簡單工廠使用分支判斷創建不同的子類對象(ConcreteProduct)。為了消除分支帶來的擴展性問題,工廠方法提取工廠類的抽象接口(Creator),將對具體產品的實例化移動到子類(ConcreteCreator)中實現。而用戶需要具體的產品對象時,只需要找到生產該類產品的工廠就可以了。因為抽象接口提供了所有工廠的統一操作接口——工廠方法。
舉例:
比如生產汽車的廠商(Creator),生產不同牌子的汽車(Product),每個具體的廠商負責一個牌子的汽車。當需要一個牌子的汽車時,我們先找到生產該類汽車的生產商,讓他幫我們生產出汽車就行了,而且這個汽車就是我們需要的牌子。實現為C++代碼如下:
//
產品類
class Car
{
public:
virtual void beep()= 0;
virtual ~Car(){}
};
class BenziCar: public Car
{
public:
virtual void beep()
{
cout<< " 奔馳汽車 "<<endl;
}
};
class BMWCar: public Car
{
public:
virtual void beep()
{
cout<< " 寶馬汽車 "<<endl;
}
};
// 工廠接口
class Factory
{
public:
virtual Car*createCar()= 0;
virtual ~Factory(){}
};
class BenziFactory: public Factory
{
public:
virtual Car*createCar()
{
return new BenziCar();
}
};
class BMWFactory: public Factory
{
public:
virtual Car*createCar()
{
return new BMWCar();
}
};
class Car
{
public:
virtual void beep()= 0;
virtual ~Car(){}
};
class BenziCar: public Car
{
public:
virtual void beep()
{
cout<< " 奔馳汽車 "<<endl;
}
};
class BMWCar: public Car
{
public:
virtual void beep()
{
cout<< " 寶馬汽車 "<<endl;
}
};
// 工廠接口
class Factory
{
public:
virtual Car*createCar()= 0;
virtual ~Factory(){}
};
class BenziFactory: public Factory
{
public:
virtual Car*createCar()
{
return new BenziCar();
}
};
class BMWFactory: public Factory
{
public:
virtual Car*createCar()
{
return new BMWCar();
}
};
如上,我們獲得汽車對象的代碼應該是這樣:
Factory*factory=
new BenziFactory();
Car*car=factory->createCar();
car->beep();
delete car;
delete factory;
Car*car=factory->createCar();
car->beep();
delete car;
delete factory;
當我們需要另外一種汽車時候,只需要修改一下生產汽車的工廠對象就好了。