1.简单工厂模式
productA 和ProductB继承同一个父类,然后有一个工厂类包含create方法创建这两个类的实例。
使用的时候,在Client中先实例化工厂类,然后调用create方法获取ProductA或B的实例。
2.工厂方法模式
简单工厂模式只用一个工厂,来创建多个Product,这样要添加新产品时就要在它的create方法中加一个分支,违背了开放-封闭原则。
所以有了工厂方法模式,使用多个工厂,需要新产品时新建一个工厂类就ok了。
自己实现代码如下:
//Father.h
#include <iostream>
class Father
{
public:
Father(){};
~Father(){};
virtual void speak() = 0;
};
class Childboy :public Father
{
public:
Childboy(){};
~Childboy(){};
void speak();
};
class Childgirl :public Father
{
public:
Childgirl(){};
~Childgirl(){};
void speak();
};
//Father.cpp
#include <iostream>
#include "Father.h"
void Childboy::speak(){
std::cout << "boy talk" << std::endl;
}
void Childgirl::speak(){
std::cout << "girl talk" << std::endl;
}
//Factory.h
#include <iostream>
#include "Father.h"
class Factory
{
public:
Factory(){};
virtual Father* create()=0;
};
class FactoryBoy:public Factory
{
public:
FactoryBoy(){};
~FactoryBoy(){};
Father* create();
};
class Factorygirl :public Factory
{
public:
Factorygirl(){};
~Factorygirl(){};
Father* create();
};
//Factory.cpp
#include<iostream>
#include "Factory.h"
using namespace std;
Father* FactoryBoy::create(){
Father *fa = new Childboy();
return fa;
}
Father* Factorygirl::create(){
Father *fa = new Childgirl();
return fa;
}
//Client.cpp
#include "Factory.h"
using namespace std;
void main(){
Factory *fac1;
FactoryBoy fb;
fac1 = &fb;
Factory *fac2 = new Factorygirl();
Father *father1 = fac1->create();
Father *father2 = fac2->create();
father1->speak();
father2->speak();
delete(fac2);
delete(father1);
delete(father2);
system("pause");
}
3.抽象工厂模式
抽象工厂模式就变得比工厂模式更为复杂,就像上面提到的缺点一样,工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。
此时,客户端要使用时必须知道是哪一个工厂并且是哪一组的产品抽象类。每一个工厂子类负责产生一族产品,而子类的一种方法产生一种类型的产品。在客户端看来只有AbstractProductA和AbstractProductB两种产品,使用的时候也是直接使用这两种产品。而通过工厂来识别是属于哪一族产品。
如下图中:ProductA1和2分别是罗技鼠标和微软鼠标,productB1和2分别是键盘,Factory1用来生产罗技的鼠标和键盘,Factory2生产微软。
好处:
- 当用户从罗技换到微软时,只要换工厂就ok了,鼠标和键盘全都换了。
- 用户只需要知道鼠标和键盘的父类,而不需要知道具体的罗技鼠标类或键盘类。