【C++设计模式】之工厂模式,小白一看就懂
1. 工厂模式
工厂模式是一种创建型模式,本文介绍两种工厂模式:简单工厂模式和抽象工厂模式。
通过工厂来创建实例,用户只负责使用。将用户的创建和使用分离,提高了代码的灵活性和可维护性。
2. 简单工厂模式
简单工厂模式就是一个工厂类,根据用户所提供的信息不同创建出不同的实例。用户只需要关系提供的信息,不需要关注实例创建的过程。
优点:
- 提高维护性:所有的对象创建都在工厂类中,方便集中管理。
- 降低耦合性:用户不需要知道具体的实例实现的过程。
缺点:
扩展性比较差,每次新增一个新的产品的时候都需要修改工厂类,违背了开放封闭原则。
结构组成:
抽象产品类:产品的公共接口,所有产品类继承此类,并在此类基础上增添相应特色。
具体产品类:继承抽象产品类,是具体的产品,具体产品的功能实现在这里。
工厂类:负责实例化产品。
简单工厂代码实现
# include<iostream>
# include<string>
using namespace std;
//抽象产品类 -- 鞋类
class Shoes
{
public:
virtual void Show() = 0;
};
//具体产品类 -- 李宁鞋
class Lining:public Shoes
{
public:
void Show()override
{
cout << "李宁鞋" << endl;
}
};
//具体产品类 -- 耐克鞋
class Nike :public Shoes
{
public:
void Show()override
{
cout << "耐克鞋" << endl;
}
};
//工厂类
class ShoesFactory
{
public:
static Shoes* CreateShoes(string type)
{
if (type == "耐克")
{
return new Nike();
}
else if (type == "李宁")
{
return new Lining();
}
else
{
cout << "没有这个产品" << endl;
return nullptr;
}
}
};
int main()
{
Shoes* ps = nullptr;
ps = ShoesFactory::CreateShoes("足力健");
ps = ShoesFactory::CreateShoes("耐克");
ps->Show();
delete ps;
ps = nullptr;
}
3. 抽象工厂模式
简单工厂模式只给产品抽象了,抽象工厂模式给工厂也抽象了。
在简单工厂模式中只有一个工厂来创建产品,在实际生活中,更加真实的是不同工厂侧重于不同的产品。这就是抽象工厂模式。
结构组成:
抽象产品类:这种产品的公共接口类
具体产品类:继承抽象产品类,工厂实例化的对象就是具体的产品
抽象工厂类:提供创建具体产品的接口
具体工厂类:继承抽象工厂,实现创建具体产品对象的方法
抽象工厂模式代码实现
//抽象工厂模式
# include<iostream>
# include<string>
using namespace std;
//抽象产品类1 -- 椅子
class Chair
{
public:
virtual void Show_Chair() = 0;
};
//抽象产品类2 -- 沙发
class Sofa
{
public:
virtual void Show_Sofa() = 0;
};
//具体产品类1 -- 木头椅子
class MuTou_Chair :public Chair
{
public:
void Show_Chair()override
{
cout << "木头椅子" << endl;
}
};
//具体产品类2 -- 金属椅子
class JinShu_Chair :public Chair
{
public:
void Show_Chair()override
{
cout << "金属椅子" << endl;
}
};
//具体产品类3 -- 木头沙发
class Mutou_Sofa :public Sofa
{
public:
void Show_Sofa()override
{
cout << "木头沙发" << endl;
}
};
//具体产品类4 -- 金属沙发
class JinShu_Sofa :public Sofa
{
public:
void Show_Sofa()override
{
cout << "金属沙发" << endl;
}
};
//抽象工厂类
class Factory
{
public:
virtual Chair* CreateChair() = 0;
virtual Sofa* CreateSofa() = 0;
};
//具体工厂类1 -- 木头工厂
class Muto_Factory:public Factory
{
public:
Chair* CreateChair()override
{
return new MuTou_Chair();
}
Sofa* CreateSofa()override
{
return new Mutou_Sofa();
}
};
//具体工厂类2 -- 金属工厂
class JinShu_Factory:public Factory
{
public:
Chair* CreateChair()override
{
return new JinShu_Chair();
}
Sofa* CreateSofa()override
{
return new JinShu_Sofa();
}
};
int main()
{
//金属厂子流水线
Factory* pJinShu_Factory = new JinShu_Factory();
Chair* pJinShu_Chair = pJinShu_Factory->CreateChair();
pJinShu_Chair->Show_Chair();
Sofa* pJinShu_Sofa = pJinShu_Factory->CreateSofa();
pJinShu_Sofa->Show_Sofa();
delete pJinShu_Factory;
delete pJinShu_Chair;
delete pJinShu_Sofa;
pJinShu_Factory = nullptr;
pJinShu_Chair = nullptr;
pJinShu_Sofa = nullptr;
}