C++实现简单工厂模式等的设计应用
一、题目分析
通过代码实现以下三种工厂模式并进行测试
(1)简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(2)工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
(3)抽象工厂模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
二、类图设计
(1)简单工厂模式
(2)工厂模式
(3)抽象工厂模式
三、程序实现
(1)简单工厂模式
#include<iostream>
#include<string>
using namespace std;
class Person
{
protected:
string sex;
public:
virtual void set_sex() {};
virtual string get_sex()
{
return sex;
}
};
class Man :public Person
{
public:
virtual void set_sex()
{
sex = "男人";
}
virtual string get_sex()
{
return sex;
}
};
class Woman :public Person
{
public:
virtual void set_sex()
{
sex = "女人";
}
virtual string get_sex()
{
return sex;
}
};
class Robot :public Person
{
public:
virtual void set_sex()
{
sex = "机器人";
}
virtual string get_sex()
{
return sex;
}
};
class Factory
{
public:
static Person* produce(char kind)
{
switch (kind)
{
case 'M':
{
Person* pro = new Man();
break;
}
case 'W':
{
Person* pro = new Woman();
break;
}
case 'R':
{
Person* pro = new Robot();
break;
}
}
}
};
int main()
{
Person* pro1;
pro1 = Factory::produce('M');
pro1->set_sex();
string result1 = pro1->get_sex();
cout << "女娲造" << result1 << endl;
Person* pro2;
pro2 = Factory::produce('W');
pro2->set_sex();
string result2 = pro2->get_sex();
cout << "女娲造" << result2 << endl;
Person* pro3;
pro3 = Factory::produce('R');
pro3->set_sex();
string result3 = pro3->get_sex();
cout << "女娲造" << result3 << endl;
}
(2)工厂模式
#include<iostream>
#include<string>
using namespace std;
class Producer
{
protected:
string brand;
public:
virtual void output()
{
cout << brand << "工厂生产" << brand << "空调" << endl;
}
};
class Producer_Haier :public Producer
{
protected:
string brand = "Haier";
public:
virtual void output()
{
cout << brand << "工厂生产" << brand << "空调" << endl;
}
};
class Producer_Midea :public Producer
{
protected:
string brand = "Midea";
public:
virtual void output()
{
cout << brand << "工厂生产" << brand << "空调";
}
};
class Factory
{
public:
virtual Producer* producer() = 0;
};
class Factory_Haier :public Factory
{
public:
Producer* producer()
{
return new Producer_Haier;
}
};
class Factory_Midea :public Factory
{
public:
Producer* producer()
{
return new Producer_Midea;
}
};
int main()
{
Factory_Haier* fh = new Factory_Haier();
Factory_Midea* fm = new Factory_Midea();
Producer* pro = fh->producer();
pro->output();
pro = fm->producer();
pro->output();
return 0;
}
(3)抽象工厂模式
#include<iostream>
#include<string>
using namespace std;
class PC
{
protected:
string name = "PC";
public:
virtual void output() = 0;
};
class MAC
{
protected:
string name = "MAC";
public:
virtual void output() = 0;
};
class PC_CPU :public PC
{
public:
virtual void output()
{
cout << "CPU工厂生产" << name << "_CPU" << endl;
}
};
class PC_RAM :public PC
{
public:
virtual void output()
{
cout << "RAM工厂生产" << name << "_RAM" << endl;
}
};
class MAC_CPU :public MAC
{
public:
virtual void output()
{
cout << "CPU工厂生产" << name << "_CPU" << endl;
}
};
class MAC_RAM :public MAC
{
public:
virtual void output()
{
cout << "RAM工厂生产" << name << "_RAM" << endl;
}
};
class Factory
{
public:
virtual PC* pc() = 0;
virtual MAC* mac() = 0;
};
class Factory_CPU :public Factory
{
public:
PC_CPU* pc()
{
return new PC_CPU;
}
MAC_CPU* mac()
{
return new MAC_CPU;
}
};
class Factory_RAM :public Factory
{
public:
PC_RAM* pc()
{
return new PC_RAM;
}
MAC_RAM* mac()
{
return new MAC_RAM;
}
};
int main()
{
Factory_CPU* f_c = new Factory_CPU();
Factory_RAM* f_r = new Factory_RAM();
PC* p1 = f_c->pc();
PC* p2 = f_r->pc();
MAC* m1 = f_c->mac();
MAC* m2 = f_r->mac();
p1->output();
p2->output();
m1->output();
m2->output();
}
四、调试、测试及运行结果
(1)简单工厂模式
(2)工厂模式
(3)抽象工厂模式
五、经验归纳
通过这次的作业,我从头到尾的完整使用了三种工厂模式来实现的相关的功能,同时也在修改代码的时候感悟到了各种工厂模式的优劣,简单工厂模式结构简单但是添加新的成分需要修改大量代码,工厂模式简单但是不能适应多元的工厂生产模式,抽象工厂方法适用于产品种类结构多的场合,主要用于创建一组(有多个种类)相关的产品,为它们提供创建的接口;就是当具有多个抽象角色时,抽象工厂便可以派上用场。