对象创建_FactoryMethod
目录
对象创建模式
通过“对象创建”模式绕开 new,来避免对象创建(new)过程中所导致的紧耦合 (依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。
典型模式
- Factory Method
- Abstract Factory
- Prototype
- Builder
1 Factory Method 工厂方法模式
1.1 模式动机
在软件系统中,经常面临着创建对象的工作;由于需求的变化, 需要创建的对象的具体类型经常变化。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制“来避免客户程序和这种“具体对象创建工作”的紧耦合?
1.2 模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
Factory Method 使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。
1.3 模式示例代码
# include <iostream>
# include <string>
// 定义抽象动物类
class Animal {
public:
virtual void makeSound() = 0;
};
// 具体动物类:狗
class Dog : public Animal {
public:
void makeSound() {
std::cout << "汪汪汪!" << std::endl;
}
};
// 具体动物类:猫
class Cat : public Animal {
public:
void makeSound() {
std::cout << "喵喵喵!" << std::endl;
}
};
// 定义动物工厂抽象类
class AnimalFactory {
public:
virtual Animal* createAnimal() = 0;
};
// 具体动物工厂类:狗工厂
class DogFactory : public AnimalFactory {
public:
Animal* createAnimal() {
return new Dog();
}
};
// 具体动物工厂类:猫工厂
class CatFactory : public AnimalFactory {
public:
Animal* createAnimal() {
return new Cat();
}
};
int main() {
// 创建狗工厂
AnimalFactory* dogFactory = new DogFactory();
// 使用狗工厂创建狗对象
Animal* dog = dogFactory->createAnimal();
dog->makeSound();
// 创建猫工厂
AnimalFactory* catFactory = new CatFactory();
// 使用猫工厂创建猫对象
Animal* cat = catFactory->createAnimal();
cat->makeSound();
// 释放内存
delete dogFactory;
delete dog;
delete catFactory;
delete cat;
return 0;
}