设计模式——Factory Method

Factory Mothod的中文名:工厂方法

作用

GOF中的描述:定义一个用于创建对象的接口,让子类决定实例化哪一类。Factory Method使一个类的实例化延迟到子类。

描述的解释:

  1. 创建:解除对类型的硬编码,使其支持可扩展的类型。
  2. 使用:手动给定类的类型,将对应的子类实例化。

优缺点

  1. 不绑定特定的类,支持进行扩展;
  2. 隔离了变化的部分——创建都在统一的函数中,且创建函数的实现可自行更改;
  3. 使用上稍微不方便,因类多,需要结合选择的参数,再去实例化哪个具体类;

结构

设计模式——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

2.  抽象工厂——Youtube

上一篇:韩国LG集团疑被勒索软件攻击,数据和代码或将泄露


下一篇:【经典】bfs+建图+TSP状压dp——leetcode 寻宝