什么是工厂模式?
工厂顾名思义,就是创建产品。该模式封装和管理对象的创建,通俗地讲就是,你new
一个对象的时候,直接调用工厂方法就行了。
工厂模式
- 当我们需要不停的创建不同的对象的时候,我们可以通过封装接口,然后调用函数返回不同的类型的对象,这个时候我们就需要工厂模式帮我们处理此问题
1. 简单工厂模式
- 将类的初始化和创建全部交给一个工厂来完成,我们只需要告诉工厂我们需要什么即可。
- 专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。
- 是一种实例化对象的方式,只要输入需要实例化对象的名字,就可以通过工厂对象的相应工厂函数来制造你需要的对象。
1. 工厂(Factory
)
- 负责创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需要的产品对象。
- 创建出产品(
Product
) ->
具体的产品(ConcreteProduct
)
2. 产品
抽象产品
- 象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公告接口。所创建的具体产品对象都是其派生对象。
具体产品
- 具体产品是简单工厂模式的创建目标。每个具体产品都继承了抽象产品,需要实现定义在抽象产品中的方法。
3. 使用
- 当我们需要创建的对象数量较多且杂的时候,我们需要使用简单工厂模式来创建对象。
- 对象的创建过程是我们不需要去关心,我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,方便后期的程序扩展和维护。
4. Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <string> enum class product_type { none, one, two };
class Product { public: Product() = default; ~Product() = default; virtual const std::string & name() { return m_name; } private: std::string m_name; };
class ProductA final :public Product { public: ProductA() = default; ~ProductA() = default; virtual const std::string& name() { return m_name; } private: std::string m_name; };
class ProductB final :public Product { public: ProductB() = default; ~ProductB() = default; virtual const std::string& name() { return m_name; } private: std::string m_name; };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| --- Factoy.h --- class Factory { public: Factory() = default; ~Factory() = default; virtual Product* crteateProduct(product_type & type) { if(type == product_type::one) { return new ProductA; } if(type == product_type::two) { return new ProductB; } else { return nullptr; } } virtual Product* crteateProduct(){}; };
|
1 2 3 4 5 6
| int main() { const auto factory = new Factory; auto product_a = factory->crteateProduct(product_type::none); return 0; }
|
2. 工厂方法模式
2.1 简介
- 简单工厂模式中最大的缺点就是当我们需要创建新的产品的时候,我们需要修改工厂的
create
方法,加入必要的处理逻辑,违背了设计原则-开闭原则
- 工厂方法模式中,工厂父类只是定义创建产品的接口,子类负责创建具体的产品,将具体产品的创建都延迟到子类中实现,通过子类创建具体的实例化对象。
实现
1 2 3 4 5 6 7 8 9 10 11
| #include "Factory.h" class FactoryA final : public Factory { public: FactoryA() = default; ~FactoryA() = default; Product* crteateProduct() override { return new ProductA; } };
|
1 2 3 4 5 6 7 8 9 10
| #include <iostream> #include "Factory.h" #include "concreteFactory.h"
int main() { const auto factory = new FactoryA; auto product_a = factory->crteateProduct(); return 0; }
|
3. 抽象工厂模式