/// simple factoty 简单工厂模式
#include <iostream>
using namespace std;
class Product
{
public:
Product() {}
virtual ~Product() {} // 因为有虚方法,析构函数最好声明为virtual
virtual string who() const {} // 虚函数,重写后用来表示派生类身份
};
class IPhone : public Product
{
public:
IPhone() {}
virtual ~IPhone() {}
virtual string who() const
{
return string("I'm IPhone ");
}
};
class IPad : public Product
{
public:
IPad() {}
virtual ~IPad() {}
virtual string who() const
{
return string("I'm IPad ");
}
};
class IPod : public Product
{
public:
IPod() {}
virtual ~IPod() {}
virtual string who() const
{
return string("I'm IPod ");
}
};
class SimpleFactory
{
public:
SimpleFactory() {}
~SimpleFactory() {}
Product* createProduct(string proName);
};
Product* SimpleFactory::createProduct(string proName)
{
if ("IPhone" == proName)
return new IPhone();
else if ("IPad" == proName)
return new IPad();
else if ("IPod" == proName)
return new IPod();
else
return NULL;
}
int main(int argc, char* argv[])
{
SimpleFactory* sf = new SimpleFactory();
Product* p;
p = sf->createProduct("IPhone");
cout << p->who() << endl;
p = sf->createProduct("IPad");
cout << p->who() << endl;
p = sf->createProduct("IPod");
cout << p->who() << endl;
}
/// 优点:外界只要传入类的名字或者识别符即可,不需要关心具体创建过程,只顾“消费”就可以了。
/// 各有各的指责和权力,分工明确,利于整个软件架构优化。
/// 缺点:违反里高内聚责任分配原则,将全部逻辑放到一个工厂类中,如果需要支持新的类,那就必须改变工厂类了。
/// 这里只有一种工厂,一个系列的产品,那如果有多个系列的产品呢?问题如何解决?
我所理解的设计模式(C++实现)——简单工厂模式(Simple Factory Pattern)
/// factory method pattern 工厂方法模式
#include <iostream>
using namespace std;
class Product
{
public:
Product() {}
virtual ~Product() {}
virtual string who() const {}
};
class IPhone : public Product
{
public:
IPhone() {}
virtual ~IPhone() {}
virtual string who() const { return string("I'm IPhone.");}
};
class IPad : public Product
{
public:
IPad() {}
virtual ~IPad() {}
virtual string who() const { return string("I'm IPad.");}
};
class Factory
{
public:
Factory() {}
virtual ~Factory() {}
virtual Product* getProduct() const {}
};
class IPhoneFac:public Factory
{
public:
IPhoneFac() {}
virtual ~IPhoneFac() {}
virtual Product* getProduct() const { return new IPhone(); }
};
class IPadFac:public Factory
{
public:
IPadFac() {}
virtual ~IPadFac() {}
virtual Product* getProduct() const { return new IPad(); }
};
int main(int argc, char* argv[])
{
Product* p;
Factory* f;
f = new IPhoneFac();
p = f->getProduct();
cout << p->who() << endl;
f = new IPadFac();
p = f->getProduct();
cout << p->who() << endl;
}