1.概述
参考文章
https://blog.csdn.net/inthat/article/details/106097509
实际开发过程中我们往往要使用不同的设计模式来应对不同的场景需求。
设计模式的初衷往往是是为了尽量少修改现有的代码,并且做到数据/UI/控制器分离的操作,更方便分模块化去管理,分离耦合,实现更好的拓展性
2 工厂模式
工厂模式顾名思义,就是你一个加工厂可以加工不同的产品和组装配件,是一个实例化对象模式
**工厂模式分类:**简单工厂模式、工厂方法模式、抽象工厂模式。
2.1 简单工厂
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
一个工厂对应多个产品。
工厂(Creator)创建角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)公共接口角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)实例角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
具体的实现方式如下图,各种各样的产品继承与其基类产品。
由工厂类来通过其产品类型来创建对应的产品。
具体实现的代码如下:
//枚举工厂的类型
enum ProductType
{
TYPEA,
TYPEB
};
class Product
{
public:
virtual void show()=0;
};
class ProductA:public Product
{
public:
void show()
{
std::cout << "a show"<< endl;
}
};
class ProductB:public Product
{
public:
void show()
{
std::cout << "b show" << endl;
}
};
class Factory
{
public:
Product* create(int type)
{
switch (type)
{
case TYPEA:
return new ProductA;
break;
case TYPEB:
return new ProductB;
default:
return nullptr;
break;
}
}
};
实例demo如下:
int main()
{
Factory f;
f.create(TYPEA)->show();
f.create(TYPEB)->show();
return 0;
}
2.2 工厂方法
多个工厂对应多个产品。
把简单工厂模式中的工厂类抽象出一个结构,这个接口只有一个创建抽象产品的工厂方法,工厂方法模式解决了简单工厂模式中出现的缺点。
// 产品基类
class Product
{
public:
virtual void Show() = 0;
};
// 工厂基类
class Factory
{
public:
virtual Product* Create() = 0;
};
// 产品 A
class ProductA : public Product
{
public:
void Show()
{
std::cout << "Product A show" << std::endl;
}
};
// 产品 B
class ProductB : public Product
{
public:
void Show()
{
std::cout << "Porduct B show" << std::endl;
}
};
// 工厂 A
class FactoryA : public Factory
{
public:
Product* Create()
{
return new ProductA;
}
};
// 工厂 B
class FactoryB : public Factory
{
public:
Product* Create()
{
return new ProductB;
}
};
int main()
{
FactoryA *factoryA = new FactoryA();
FactoryB *factoryB = new FactoryB();
factoryA->Create()->Show();
factoryB->Create()->Show();
return 0;
}
2.3 抽象工厂
抽象工厂是一种常见的设计模式。此模式为一个产品家族提供了统一的创建接口。当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对系的系列来创建一个具体的工厂类别。
抽象工厂也是用的最多的。
建立一个统一的抽象工厂类。
其他工厂继承这个抽象工厂类。
每个工厂内部可以生成不同的产品。
这个在项目实际用到比较多的。
百度百科