Mastering Design Patterns: Singleton, Factory, and Observer

MEDIUM9 min readby AdminJune 19, 2026History
5.0|1 ratingLog in to rate

Explore software design patterns: Singleton, Factory Method, and Observer with parallel C++ and Python implementations.

#oop#architecture#design-patterns#singleton#factory

Software Design Patterns Overview

Design patterns are typical solutions to common problems in software design. They are divided into three groups:

• Creational: Deal with object creation mechanisms (e.g. Singleton, Factory). • Structural: Deal with assembling classes into larger structures (e.g. Adapter, Decorator). • Behavioral: Deal with communication and delegation between objects (e.g. Observer, Strategy).

Let's write down standard implementations of Singleton and Factory.

Thread-Safe Singleton in C++

cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <mutex>

class DatabaseConnectionPool {
private:
    static DatabaseConnectionPool* instance;
    static std::mutex mutex;

    // Private constructor blocks direct instantiations
    DatabaseConnectionPool() {}

public:
    // Double-checked locking pattern for multi-threading safety
    static DatabaseConnectionPool* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mutex);
            if (instance == nullptr) {
                instance = new DatabaseConnectionPool();
            }
        }
        return instance;
    }
};

// Initialize static fields
DatabaseConnectionPool* DatabaseConnectionPool::instance = nullptr;
std::mutex DatabaseConnectionPool::mutex;

Metaclass-based Singleton in Python

python
1
2
3
4
5
6
7
8
9
10
class SingletonMeta(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class DatabaseConnectionPool(metaclass=SingletonMeta):
    def __init__(self):
        self.connection_string = "postgresql://..."

Discussion

Join the discussion! Sign in to leave comments and ask questions.

Loading discussion...