简单工厂模式
把创建封装进一个类里,当实现变化时,我们只需要修改这一个地方。
类图如下
工厂方法处理对象的创建,并将对象的创建封装在子类中,使得客户代码从子类对象的创建代码解耦。
代码示例如下
#include <iostream>
using namespace std;
class Product
{
public:
Product()
{
}
virtual ~Product()
{
}
virtual int Operate(int x,int y)
{
throw runtime_error("error");
}
};
class ProductA final : public Product // +
{
public:
ProductA() : Product() {}
virtual ~ProductA() {}
int Operate(int x,int y) override
{
return x + y;
}
};
class ProductB : public Product // *
{
public:
ProductB() : Product() {}
virtual ~ProductB() {}
int Operate(int x,int y) override
{
return x * y;
}
};
enum ProductType { PRODUCT_A, PRODUCT_B };
class Factory
{
public:
virtual ~Factory() {}
Product* create_product(ProductType type)
{
if (type == PRODUCT_A)
{
cout << "create product A" << endl;
return new ProductA();
}
else if (type == PRODUCT_B)
{
cout << "create product B" << endl;
return new ProductB();
}
else
{
throw runtime_error("error type");
}
}
};
int main()
{
cout << "test" << endl;
Factory factory;
Product* op1 = factory.create_product(PRODUCT_A);
cout << op1->Operate(3, 2) << endl;
Product* op2 = factory.create_product(PRODUCT_B);
cout << op2->Operate(3, 2) << endl;
//factory.create_product(PRODUCT_C);
return 0;
}
抽象工厂模式
抽象工厂为产品家族提供一个接口。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
类图如下:
工厂模式和抽象工厂模式的区别
- 工厂模式适用于创建单一类型的对象,而抽象工厂模式适用于创建多个相互关联的对象。
- 工厂模式是一对一的,抽象工厂模式是多对多的。
抽象工厂的优点:
组织一批相关的产品,有多个工厂。
缺点:
添加产品的时候,需要改变接口,进入类的内部修改类。
工厂方法的优点:
将客户代码从要实例化的具体类中解耦,不需要知道要创建哪些具体类(接口是同一个,参数不一样)