【设计模式】Factory Method模式
程序员文章站
2022-06-15 09:27:36
...
有的书上把工厂模式分为三种:简单工厂、工厂方法和抽象工厂。GOF并没有把简单工厂作为设计模式之一列出。个人觉得简单工厂是工厂方法的一个特例。
一、简单工厂(Simple Factory)
作用:专门由一个类来决定实例化哪个产品类。
#include <iostream>
using namespace std;
// 产品虚基类
class Product
{
public:
virtual ~Product(){}
virtual void showProduct()=0;
};
// 产品A
class ProductA: public Product
{
public:
virtual ~ProductA(){}
void showProduct() // 重写基类方法
{
std::cout << "this is productA" << std::endl;
}
};
// 产品B
class ProductB: public Product
{
public:
virtual ~ProductB(){}
void showProduct() // 重写基类方法
{
std::cout << "this is productB" << std::endl;
}
};
// 工厂类:我们用该类生成具体的产品
class Factory
{
public:
Product *getProduct(int type)
{
if(0 == type)
{
return new ProductA;
}
else if(1 == type)
{
return new ProductB;
}
else
{
std::cout << "sorry i can't create this product" << std::endl;
return NULL;
}
}
};
int main()
{
Factory* factory = new Factory();
Product* product1 = factory->getProduct(0);
Product* product2 = factory->getProduct(1);
product1->showProduct();
product2->showProduct();
return 0;
}
二、工厂方法(Factory Method)
上面提到的简单工厂是由一个类来完成创建产品的工作,我们想要得到某个产品时,需要传递给工厂类一个标识(type),工厂类根据type类型来生成不同的产品。工厂方法在此基础上有所变化,工厂类不想自己做这个工作了,它把自己提升为基类,具体的创建工作交给子类去完成,一般的每个子类只生产一个产品。
#include <iostream>
using namespace std;
// 产品虚基类
class Product
{
public:
virtual ~Product(){}
virtual void showProduct()=0;
};
// 产品A
class ProductA: public Product
{
public:
virtual ~ProductA(){}
void showProduct() // 重写基类方法
{
std::cout << "this is productA" << std::endl;
}
};
// 产品B
class ProductB: public Product
{
public:
virtual ~ProductB(){}
void showProduct() // 重写基类方法
{
std::cout << "this is productB" << std::endl;
}
};
// 工厂类
class Factory
{
public:
virtual ~Factory() {}
virtual Product *getProduct() = 0;
};
// 工厂类A:只生产产品A
class FactoryA: public Factory
{
public:
virtual ~FactoryA(){}
Product *getProduct()
{
return new ProductA;
}
};
// 工厂类B:只生产产品B
class FactoryB: public Factory
{
public:
virtual ~FactoryB(){}
Product *getProduct()
{
return new ProductB;
}
};
int main()
{
Factory* factory1 = new FactoryA();
Factory* factory2 = new FactoryB();
Product* product1 = factory1->getProduct();
Product* product2 = factory2->getProduct();
product1->showProduct();
product2->showProduct();
delete product1;
delete product2;
delete factory1;
delete factory2;
return 0;
}
三、抽象工厂(Abstract Factory)
上面提到的工厂方法,如果把产品定为汉堡、薯条和可乐,工厂类比成餐厅,用户可能会说给我一个汉堡,一个薯条和一杯可乐,发出三个命令来得到一顿饭。抽象工厂模式可以让用户只发出一个命令即可完成。
这里还是用网上一个例子说明:
#include <iostream>
using namespace std;
// 产品虚基类
class Product
{
public:
virtual ~Product(){}
virtual void showProduct()=0;
};
// 产品:床
class ProductBed: public Product
{
public:
virtual ~ProductBed(){}
void showProduct() // 重写基类方法
{
std::cout << "this is ProductBed" << std::endl;
}
};
// 产品:桌子
class ProductDesk: public Product
{
public:
virtual ~ProductDesk(){}
void showProduct() // 重写基类方法
{
std::cout << "this is ProductDesk" << std::endl;
}
};
// 产品:门
class ProductDoor: public Product
{
public:
virtual ~ProductDoor(){}
void showProduct() // 重写基类方法
{
std::cout << "this is ProductDoor" << std::endl;
}
};
// 产品:沙发
class ProductSofa: public Product
{
public:
virtual ~ProductSofa(){}
void showProduct() // 重写基类方法
{
std::cout << "this is ProductSofa" << std::endl;
}
};
// 工厂类
class Home
{
public:
virtual ~Home() {}
virtual void showMyHouse() = 0;
protected:
Product *bed;
Product *desk;
Product *door;
Product *sofa;
};
// 工厂子类:只生产简单的家,包括床和门
class SimpleHome: public Home
{
public:
SimpleHome()
{
bed = new ProductBed();
door = new ProductDoor();
}
virtual ~SimpleHome(){}
void showMyHouse()
{
bed->showProduct();
door->showProduct();
}
};
// 工厂子类:生产高级的家,包括床、门、桌子和沙发
class AdvancedHome: public Home
{
public:
AdvancedHome()
{
bed = new ProductBed();
door = new ProductDoor();
desk = new ProductDesk();
sofa = new ProductSofa();
}
virtual ~AdvancedHome(){}
void showMyHouse()
{
bed->showProduct();
door->showProduct();
desk->showProduct();
sofa->showProduct();
}
};
// 调用工厂的客户类
class Client
{
public:
Client(Home * newHome)
{
myHome = newHome;
}
void showHome()
{
myHome->showMyHouse();
}
private:
Home *myHome;
};
int main()
{
// 一个客户只想要一个简单的家
Client *A = new Client(new SimpleHome);
A->showHome();
// 另一个客户想要一个高级点的家
Client *B = new Client(new AdvancedHome);
B->showHome();
return 0;
}
参考资料:http://www.cnblogs.com/PatrickChen/archive/2009/11/24/1328081.html
《常见设计模式的解析与C++实现》
2011-11-16 任洪彩 aaa@qq.com
转载于:https://my.oschina.net/renhc/blog/37247