工厂模式
- 每次使用new时,是针对实现编程。
- 工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。(创建一个对象) 工厂方法允许类将实例化延迟到子类进行 Pizza商店类和Pizza类用到该方法
- 设计原则:要依赖抽象,不要依赖具体类。不能让高层组件依赖低层组件,而且,不管高层或低层组件,"两者"都应该依赖于抽象。
- 抽象工厂模式:提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体类。(创建多个对象) 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。 PizzaIngredient类中的各个调料的获取用到该方法
例子
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5NrMroa-1662622497286)(img/factory.png)]](https://i-blog.csdnimg.cn/blog_migrate/db7ae140012d366f61c64956790bc36a.png)
class PizzaIngredientFactory{
public:
virtual ~PizzaIngredientFactory(){};
virtual string createDough()=0;
virtual string createSauce()=0;
virtual string createCheese()=0;
virtual string createVeggies()=0;
virtual string createPepperoni()=0;
virtual string createClams()=0;
};
class NYPizzaIngredientFactory:public PizzaIngredientFactory{
public:
virtual string createDough(){
return "NY Dough";
}
virtual string createSauce(){
return "NY Sauce";
};
virtual string createCheese(){
return "NY Cheese";
}
virtual string createVeggies(){
return "NY Veggies";
}
virtual string createPepperoni(){
return "NY Pepperoni";
}
virtual string createClams(){
return "NY Clams";
}
};
class ChicagoPizzaIngredientFactory:public PizzaIngredientFactory{
public:
virtual string createDough(){
return "CH Dough";
}
virtual string createSauce(){
return "CH Sauce";
};
virtual string createCheese(){
return "CH Cheese";
}
virtual string createVeggies(){
return "CH Veggies";
}
virtual string createPepperoni(){
return "CH Pepperoni";
}
virtual string createClams(){
return "CH Clams";
}
};
class Pizza{
public:
Pizza(){};
virtual ~Pizza(){};
virtual void prepare()=0;
void bake(){
cout<<"Bake for 25 minutes at 350"<<endl;
}
void cut(){
cout<<"Cutting the pizza into diagonal slices"<<endl;
}
void box(){
cout<<"Place pizza in official PizzaStore box"<<endl;
}
string getName(){
return name;
}
public:
string name;
string dough;
string sauce;
};
class NYStyleCheesePizza : public Pizza{
public:
NYStyleCheesePizza(PizzaIngredientFactory* newingredient):ingredient(newingredient){
name ="NY Style Sauce and Cheese Pizza";
dough = ingredient->createDough();
sauce = ingredient->createSauce();
}
virtual void prepare(){
cout<<name<<" "<<dough<<sauce<<endl;
};
private:
PizzaIngredientFactory* ingredient;
};
class ChicagoStyleCheesePizza: public Pizza{
public:
ChicagoStyleCheesePizza(PizzaIngredientFactory* newingredient):ingredient(newingredient){
name ="Chicago Style Sauce and Cheese Pizza";
dough = ingredient->createDough();
sauce = ingredient->createSauce();
}
virtual void prepare(){
cout<<name<<" "<<dough<<" "<<sauce<<endl;
};
private:
PizzaIngredientFactory* ingredient;
};
class PizzaStore{
public:
PizzaStore(){};
virtual ~PizzaStore(){
};
Pizza* orderPizza(string order){
Pizza* newpizza = createPizza(order);
newpizza->prepare();
newpizza->bake();
newpizza->cut();
newpizza->box();
return newpizza;
}
protected:
virtual Pizza* createPizza(string order)=0;
};
class NYStylePizzaStore : public PizzaStore{
public:
NYStylePizzaStore(){
}
private:
virtual Pizza* createPizza(string order){
if(order=="cheese"){
return new NYStyleCheesePizza(ingredient);
}
}
private:
PizzaIngredientFactory* ingredient = new NYPizzaIngredientFactory;
};
class ChicagoPizzaStore : public PizzaStore{
public:
ChicagoPizzaStore(){
}
private:
virtual Pizza* createPizza(string order){
if(order=="cheese"){
return new ChicagoStyleCheesePizza(ingredient);
}
}
private:
PizzaIngredientFactory* ingredient = new ChicagoPizzaIngredientFactory;
};
int main(){
//Espresso1.99 HouseBlend0.89 Mocha1 Whip2
NYStylePizzaStore* nyStore = new NYStylePizzaStore;
nyStore->orderPizza("cheese");
ChicagoPizzaStore* chstore = new ChicagoPizzaStore;
chstore->orderPizza("cheese");
// pizza->getName();
system("pause");
return 0;
}