一:简单工厂模式
例子:一个工厂生产水果产品,水果包括苹果,橘子等。在这个工厂的工厂方法中根据客户的需求来选择生产的水果具体是哪一种。
#include<iostream>
#include<string>
using namespace std;
class Fruit
{
public:
virtual void show()=0;
};
class Apple:public Fruit
{
public:
void show()
{
cout<<"Apple"<<endl;
}
};
class Orange:public Fruit
{
public:
void show()
{
cout<<"Orange"<<endl;
}
};
class Factory
{
public:
static Fruit* factory(string str)
{
if(str=="Apple")
{
return new Apple();
}
else if(str=="Orange")
{
return new Orange();
}
else
return NULL;
}
};
void main()
{
Fruit* fruit=Factory::factory("apple");
if(!fruit)
return ;
fruit->show();
}
缺点:当每次要增加一种水果时,要修改工厂方法。
二:工厂方法模式
#include<iostream>
#include<string>
using namespace std;
class Fruit
{
public:
virtual void show()=0;
};
class Apple:public Fruit
{
public:
void show()
{
cout<<"Apple"<<endl;
}
};
class Orange:public Fruit
{
public:
void show()
{
cout<<"Orange"<<endl;
}
};
class Factory
{
public:
virtual Fruit* factory()=0;
};
class AppleFactory:public Factory
{
public:
Fruit* factory()
{
return new Apple();
}
};
class OrangeFactory:public Factory
{
public:
Fruit* factory()
{
return new Orange();
}
};
void main()
{
Fruit* fruit=(new AppleFactory())->factory();
if(!fruit)
return ;
fruit->show();
}
缺点:每次增加一种水果产品,需要增加一个生产这种水果的工厂。
三:抽象工厂
这里涉及到产品簇和产品等级的概念。比如水果和CPU这是两个产品簇,假如水果只有苹果和橘子这两种,CPU只有单核和多核。那么可以认为水果和CPU的产品等级是一样的都是2个。
那么如果这里用工厂方法的模式,就需要再添加一个抽象工厂和两个具体工厂。这里我们可以采用抽象工厂的模式。一个抽象工厂,两个抽象方法,每个抽象方法生产一个产品簇中的一个产品等级。
#include<iostream>
#include<string>
using namespace std;
class Fruit
{
public:
virtual void show()=0;
};
class Apple:public Fruit
{
public:
void show()
{
cout<<"Apple"<<endl;
}
};
class Orange:public Fruit
{
public:
void show()
{
cout<<"Orange"<<endl;
}
};
class CPU
{
public:
virtual void show()=0;
};
class SingleCPU:public CPU
{
public:
void show()
{
cout<<"SingleCPU"<<endl;
}
};
class MutiCPU:public CPU
{
public:
void show()
{
cout<<"MutiCPU"<<endl;
}
};
class Factory
{
public:
virtual Fruit* fruitFactory()=0;
virtual CPU* cpuFactory()=0;
};
class Factory1:public Factory
{
public:
Fruit* fruitFactory()
{
return new Apple();
}
CPU* cpuFactory()
{
return new SingleCPU();
}
};
class Factory2:public Factory
{
public:
Fruit* fruitFactory()
{
return new Orange();
}
CPU* cpuFactory()
{
return new MutiCPU();
}
};
void main()
{
Factory* factory=new Factory1();
Fruit* fruit=factory->fruitFactory();
fruit->show();
CPU* cpu=factory->cpuFactory();
cpu->show();
}