客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
下面用具体的实例来讲解简单工厂模式,假设有一个汽车销售工厂,这个工厂销售各种汽车,如宝马、福特等,我们先建立汽车产品类
// 汽车抽象类。
class Car
{
public:
virtual void Sale() = 0;
};
// 福特汽车子类。
class FordCar: public Car
{
void Sale()
{
printf("Sale Ford car!\n");
}
};
// 宝马汽车子类。
class BmwCar: public Car
{
void Sale()
{
printf("Sale BMW car!\n");
}
};
class Car
{
public:
virtual void Sale() = 0;
};
// 福特汽车子类。
class FordCar: public Car
{
void Sale()
{
printf("Sale Ford car!\n");
}
};
// 宝马汽车子类。
class BmwCar: public Car
{
void Sale()
{
printf("Sale BMW car!\n");
}
};
然后建立汽车类工厂CarFactory
// 汽车工厂类。
class CarFactory
{
public:
static Car *SaleCar(const char *prmString);
};
Car * CarFactory::SaleCar( const char *prmString )
{
if (stricmp(prmString, "bmw") == 0)
{
return new FordCar();
}
else if (stricmp(prmString, "ford") == 0)
{
return new BmwCar();
}
else
{
return NULL;
}
}
class CarFactory
{
public:
static Car *SaleCar(const char *prmString);
};
Car * CarFactory::SaleCar( const char *prmString )
{
if (stricmp(prmString, "bmw") == 0)
{
return new FordCar();
}
else if (stricmp(prmString, "ford") == 0)
{
return new BmwCar();
}
else
{
return NULL;
}
}
这样我们就可以通过给工厂打个电话:“我要销售宝马汽车”,工厂接到电话后就会把宝马给你开过来了。
void main()
{
Car *car1 = CarFactory::SaleCar("bmw");
car1->Sale();
Car *car2 = CarFactory::SaleCar("ford");
car2->Sale();
delete car1;
delete car2;
}
{
Car *car1 = CarFactory::SaleCar("bmw");
car1->Sale();
Car *car2 = CarFactory::SaleCar("ford");
car2->Sale();
delete car1;
delete car2;
}