创建型之工厂方法模式C 实现考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。
实际中许多工厂是综合型的工厂,能生产多种类 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
抽象工厂模式:一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
满足条件:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
主要角色:
- 抽象工厂:提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
- 具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
具体案例:
第一步:抽象产品类
代码语言:javascript复制#pragma once
#include <iostream>
using namespace std;
#include <string>
//抽象产品类
class Phone
{
public:
virtual string CreatePhone()=0;
};
class Headset
{
public:
virtual string CreateHeadset()=0;
};
class Charger
{
public:
virtual string CreateCharger()=0;
};
第二步:具体产品类
代码语言:javascript复制//华为
class HWPhone:public Phone
{
public:
string CreatePhone()override
{
return "华为荣耀手机";
}
};
class HWHeadset:public Headset
{
public:
string CreateHeadset()override
{
return "华为荣耀耳机";
}
};
class HWCharger:public Charger
{
public:
string CreateCharger()override
{
return "华为荣耀充电器";
}
};
//小米,具体产品类
class XMPhone:public Phone
{
public:
string CreatePhone()override
{
return "小米10手机";
}
};
class XMHeadset:public Headset
{
public:
string CreateHeadset()override
{
return "小米10耳机";
}
};
class XMCharger:public Charger
{
public:
string CreateCharger()override
{
return "小米10充电器";
}
};
第三步:抽象工厂类
代码语言:javascript复制class AbstractFactory
{
public:
virtual Phone* GetPhone()=0;
virtual Headset* GetHeadset()=0;
virtual Charger* GetCharger()=0;
};
第四步:具体工厂类
代码语言:javascript复制//华为
class HWFactory:public AbstractFactory
{
public:
Phone* GetPhone()override
{
return new HWPhone();
}
Headset* GetHeadset()override
{
return new HWHeadset();
}
Charger* GetCharger()override
{
return new HWCharger();
}
};
//小米具体工厂类
class XMFactory:public AbstractFactory
{
public:
Phone* GetPhone()override
{
return new XMPhone();
}
Headset* GetHeadset()override
{
return new XMHeadset();
}
Charger* GetCharger()override
{
return new XMCharger();
}
};
第五步:主函数实现
代码语言:javascript复制#include "f.h"
int main()
{
//华为工厂生产华为手机
HWFactory *hwFactory=new HWFactory();
string phone=hwFactory->GetPhone()->CreatePhone();
string headset=hwFactory->GetHeadset()->CreateHeadset();
string charger=hwFactory->GetCharger()->CreateCharger();
cout<<"华为: "<<phone<<" "<<headset<<" "<<charger<<endl;
XMFactory *xmFactory=new XMFactory();
phone=xmFactory->GetPhone()->CreatePhone();
headset=xmFactory->GetHeadset()->CreateHeadset();
charger=xmFactory->GetCharger()->CreateCharger();
cout<<"小米: "<<phone<<" "<<headset<<" "<<charger<<endl;
}
结果显示:
需求增加:增加一款Opp产品
第二步中添加具体产品类:
代码语言:javascript复制//新增Opp手机产品
class OPPhone:public Phone
{
public:
string CreatePhone()override
{
return "Opp手机";
}
};
class OPHeadset:public Headset
{
public:
string CreateHeadset()override
{
return "Opp耳机";
}
};
class OPCharger:public Charger
{
public:
string CreateCharger()override
{
return "Opp充电器";
}
};
第四步中添加具体工厂类
代码语言:javascript复制class OPFactory:public AbstractFactory
{
public:
Phone* GetPhone()override
{
return new OPPhone();
}
Headset* GetHeadset()override
{
return new OPHeadset();
}
Charger* GetCharger()override
{
return new OPCharger();
}
};
主函数中添加实现
代码语言:javascript复制 OPFactory *opFactory=new OPFactory();
phone=opFactory->GetPhone()->CreatePhone();
headset=opFactory->GetHeadset()->CreateHeadset();
charger=opFactory->GetCharger()->CreateCharger();
cout<<"Opp: "<<phone<<" "<<headset<<" "<<charger<<endl;
结果显示: