Abstract Factory, Builder, and Factory Method — GoF Creational Patterns

This section covers the tail end of the Abstract Factory pattern (maze game variations and Smalltalk implementation), the complete Builder pattern (separating complex object construction from representation), and the beginning of the Factory Method pattern (deferring instantiation to subclasses). All three are creational patterns from the Gang of Four catalog that address different aspects of object creation flexibility.

Key Concepts

Commands and Syntax

Builder pattern structure (C++):


// Abstract Builder with empty defaults
class MazeBuilder {
public:
    virtual void BuildMaze() { }
    virtual void BuildRoom(int room) { }
    virtual void BuildDoor(int roomFrom, int roomTo) { }
    virtual Maze* GetMaze() { return 0; }
protected:
    MazeBuilder();
};

// Director uses Builder interface — hides internal representation
Maze* MazeGame::CreateMaze(MazeBuilder& builder) {
    builder.BuildMaze();
    builder.BuildRoom(1);
    builder.BuildRoom(2);
    builder.BuildDoor(1, 2);
    return builder.GetMaze();
}

// Client usage
MazeGame game;
StandardMazeBuilder builder;
game.CreateMaze(builder);
Maze* maze = builder.GetMaze();

CountingMazeBuilder — Builder that doesn't create, only counts:


class CountingMazeBuilder : public MazeBuilder {
public:
    virtual void BuildRoom(int) { _rooms++; }
    virtual void BuildDoor(int, int) { _doors++; }
    void GetCounts(int& rooms, int& doors) const;
private:
    int _doors;
    int _rooms;
};

Smalltalk Abstract Factory with partCatalog:


createMazeFactory
    ^ (MazeFactory new
        addPart: Wall named: #wall;
        addPart: EnchantedRoom named: #room;
        addPart: DoorNeedingSpell named: #door;
        yourself)

make: partName
    ^ (partCatalog at: partName) new

Factory Method structure (C++):


// Creator declares factory method
class Application {
public:
    virtual Document* CreateDocument() = 0;
};

// ConcreteCreator overrides to return ConcreteProduct
class MyApplication : public Application {
public:
    Document* CreateDocument() override {
        return new MyDocument;
    }
};

Relationships

Exam-Relevant Points