工厂模式是一种常见的设计模式,主要用于创建对象。它通过将对象的创建过程封装在工厂类中,从而实现对象创建与使用分离的目的。在C++中,可以采用多种方法来实现工厂模式。以下我们将详细介绍几种常见的方式,并结合代码示例进行说明。
简单工厂模式的核心思想是通过一个工厂类来负责创建不同类型的对象。虽然这种模式不完全符合“开闭原则”,但它非常适合初学者理解和使用。
#include <iostream>
#include <string>
#include <map>
// 基类接口
class Product {
public:
virtual void use() = 0;
virtual ~Product() {}
};
// 具体产品A
class ConcreteProductA : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductA" << std::endl;
}
};
// 具体产品B
class ConcreteProductB : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductB" << std::endl;
}
};
// 工厂类
class SimpleFactory {
public:
static Product* createProduct(const std::string& type) {
if (type == "A") {
return new ConcreteProductA();
} else if (type == "B") {
return new ConcreteProductB();
}
return nullptr;
}
};
int main() {
Product* productA = SimpleFactory::createProduct("A");
productA->use(); // 输出: Using ConcreteProductA
Product* productB = SimpleFactory::createProduct("B");
productB->use(); // 输出: Using ConcreteProductB
delete productA;
delete productB;
return 0;
}
工厂方法模式通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。这种方式更加灵活,符合“开闭原则”。
#include <iostream>
// 产品基类
class Product {
public:
virtual void use() = 0;
virtual ~Product() {}
};
// 具体产品A
class ConcreteProductA : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductA" << std::endl;
}
};
// 具体产品B
class ConcreteProductB : public Product {
public:
void use() override {
std::cout << "Using ConcreteProductB" << std::endl;
}
};
// 工厂基类
class Factory {
public:
virtual Product* createProduct() = 0;
virtual ~Factory() {}
};
// 具体工厂A
class ConcreteFactoryA : public Factory {
public:
Product* createProduct() override {
return new ConcreteProductA();
}
};
// 具体工厂B
class ConcreteFactoryB : public Factory {
public:
Product* createProduct() override {
return new ConcreteProductB();
}
};
int main() {
Factory* factoryA = new ConcreteFactoryA();
Product* productA = factoryA->createProduct();
productA->use(); // 输出: Using ConcreteProductA
Factory* factoryB = new ConcreteFactoryB();
Product* productB = factoryB->createProduct();
productB->use(); // 输出: Using ConcreteProductB
delete productA;
delete productB;
delete factoryA;
delete factoryB;
return 0;
}
抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它适用于需要创建一组具有相同主题的对象的情况。
#include <iostream>
// 抽象产品A
class AbstractProductA {
public:
virtual void use() = 0;
virtual ~AbstractProductA() {}
};
// 抽象产品B
class AbstractProductB {
public:
virtual void use() = 0;
virtual ~AbstractProductB() {}
};
// 具体产品A1
class ConcreteProductA1 : public AbstractProductA {
public:
void use() override {
std::cout << "Using ConcreteProductA1" << std::endl;
}
};
// 具体产品A2
class ConcreteProductA2 : public AbstractProductA {
public:
void use() override {
std::cout << "Using ConcreteProductA2" << std::endl;
}
};
// 具体产品B1
class ConcreteProductB1 : public AbstractProductB {
public:
void use() override {
std::cout << "Using ConcreteProductB1" << std::endl;
}
};
// 具体产品B2
class ConcreteProductB2 : public AbstractProductB {
public:
void use() override {
std::cout << "Using ConcreteProductB2" << std::endl;
}
};
// 抽象工厂
class AbstractFactory {
public:
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
virtual ~AbstractFactory() {}
};
// 具体工厂1
class ConcreteFactory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA1();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB1();
}
};
// 具体工厂2
class ConcreteFactory2 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA2();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB2();
}
};
int main() {
AbstractFactory* factory1 = new ConcreteFactory1();
AbstractProductA* productA1 = factory1->createProductA();
productA1->use(); // 输出: Using ConcreteProductA1
AbstractProductB* productB1 = factory1->createProductB();
productB1->use(); // 输出: Using ConcreteProductB1
AbstractFactory* factory2 = new ConcreteFactory2();
AbstractProductA* productA2 = factory2->createProductA();
productA2->use(); // 输出: Using ConcreteProductA2
AbstractProductB* productB2 = factory2->createProductB();
productB2->use(); // 输出: Using ConcreteProductB2
delete productA1;
delete productB1;
delete productA2;
delete productB2;
delete factory1;
delete factory2;
return 0;
}