目录

对象创建_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;
}

2 要点总结