Factory Mothod的中文名:工厂方法
作用
GOF中的描述:定义一个用于创建对象的接口,让子类决定实例化哪一类。Factory Method使一个类的实例化延迟到子类。
描述的解释:
- 创建:解除对类型的硬编码,使其支持可扩展的类型。
- 使用:手动给定类的类型,将对应的子类实例化。
优缺点
- 不绑定特定的类,支持进行扩展;
- 隔离了变化的部分——创建都在统一的函数中,且创建函数的实现可自行更改;
- 使用上稍微不方便,因类多,需要结合选择的参数,再去实例化哪个具体类;
结构
例子
// Maze.h
#pragma once
class Room {
public:
Room(int n) { }
};
class Wall {};
class Door {
public:
Door(Room* r1, Room* r2) {}
};
class Maze {
public:
void AddRoom(Room* r1) {}
};
/
class EnhantedRoom : public Room {
public:
EnhantedRoom(int n) : Room(n) {
}
};
class DoorNeedingSpell : public Door {
public:
DoorNeedingSpell(Room* r1, Room* r2) : Door(r1, r2) { }
};
class BombedWall : public Wall {};
class BombedRoom : public Room {
public:
BombedRoom(int n) : Room(n) {}
};
// MazeGame.h
#pragma once
#include "Maze.h"
class MazeGame {
public:
MazeGame() {}
Maze* CreateMaze()
{
Maze* aMaze = MakeMaze();
Room* r1 = MakeRoom(1);
Room* r2 = MakeRoom(2);
Door* door = MakeDoor(r1, r2);
aMaze->AddRoom(r1);
aMaze->AddRoom(r2);
// ...
return aMaze;
}
virtual Maze* MakeMaze() const { return new Maze(); }
virtual Wall* MakeWall() const { return new Wall; }
virtual Room* MakeRoom(int n) const { return new Room(n); }
virtual Door* MakeDoor(Room* r1, Room* r2) const { return new Door(r1, r2); }
};
// 不同实现
class EnchantedMazeGame : public MazeGame {
public:
EnchantedMazeGame() {}
// Differ with Maze Factory
virtual Room* MakeRoom(int n) const { return new EnhantedRoom(n); }
virtual Door* MakeDoor(Room* r1, Room* r2) const { return new DoorNeedingSpell(r1, r2); }
};
class BombedMazeGame : public MazeGame {
public:
BombedMazeGame() {}
virtual Wall* MakeWall() const { return new BombedWall; }
virtual Room* MakeRoom(int n) const { return new BombedRoom(n); }
};
// main.cpp
#include <iostream>
/
#include "MazeGame.h"
int main()
{
{
MazeGame* game = new MazeGame();
Maze* aMaze = game->CreateMaze();
}
{
MazeGame* game = new EnchantedMazeGame();
Maze* aMaze = game->CreateMaze();
}
{
MazeGame* game = new BombedMazeGame();
Maze* aMaze = game->CreateMaze();
}
}
Github连接:https://github.com/potterhere/CS-note/tree/master/DesignPattern/CreateMode_FactoryMethod
相关模式
抽象工厂(Abstract Factory)。
抽象工厂和工厂方法两者之间极为相似,不同的地方在于抽象工厂中,提取出了抽象的接口部分,需要在早期设计中实现。
参考资料
1. 《设计模式:可复用面向对象软件的基础》 GOF