Паттерн мост python

Мост — структурный паттерн, основная задача которого отделить абстракцию(например интерфейс) от реализации (например бэкенд).
яркий пример — это интерфейс «пульт» и реализации «телевизор»

для этого мы создаем абстрактный класс телевизора, реализующий определенные методы и абстрактный класс управляющего устройства.
Теперь мы можем создавать сколько угодно пультов разных моделей и привязывать их к разным моделям телевизоров,
не вмешиваясь в реализацию телевизора и наоборот.

# coding: utf-8

class TVBase(object):
    """Абстрактный телевизор"""
    def tune_channel(self, channel):
        raise NotImplementedError()


class SonyTV(TVBase):
    """Телевизор Sony"""
    def tune_channel(self, channel):
        print('Sony TV: выбран %d канал' % channel)


class SharpTV(TVBase):
    """Телевизор Sharp"""
    def tune_channel(self, channel):
        print('Sharp TV: выбран %d канал' % channel)


class RemoteControlBase(object):
    """Абстрактный пульт управления"""
    def __init__(self):
        self._tv = self.get_tv()

    def get_tv(self):
        raise NotImplementedError()

    def tune_channel(self, channel):
        self._tv.tune_channel(channel)


class RemoteControl(RemoteControlBase):
    """Пульт управления"""
    def __init__(self):
        super(RemoteControl, self).__init__()
        self._channel = 0  # текущий канал

    def get_tv(self):
        return SharpTV()

    def tune_channel(self, channel):
        super(RemoteControl, self).tune_channel(channel)
        self._channel = channel

    def next_channel(self):
        self._channel += 1
        self.tune_channel(self._channel)

    def previous_channel(self):
        self._channel -= 1
        self.tune_channel(self._channel)


remote_control = RemoteControl()
remote_control.tune_channel(5)  # Sharp TV: выбран 5 канал
remote_control.next_channel() # Sharp TV: выбран 6 канал

Реализация паттерна Адаптер на python

Адаптер — это один из структурных паттернов, из названия которого исходит его и назначения. По сути это типичный переходник для разных интерфейсов или данных.
1. Адаптер имеет интерфейс, который совместим с одним из объектов.
2. Поэтому этот объект может свободно вызывать методы адаптера.
3. Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и последовательности, которые понятны второму объекту.

Вырожденная форма адаптера — двухсторонний адаптер.
Нефизические примеры из жизни — это например система СМЭВ, которая предоставляет сервисы для получения/ обмена информацией.
Однако для работы вашего приложения со СМЭВ нужны адаптеры на вашей стороне, которые могут воспринимать данные, полученные со стороны СМЭВ, переводя их в объекты, понятные вашей системе.

Существуют адаптеры класса и адаптеры объекта.

пример адаптера на python для круглых отверстий и кольев квадратного сечения

# coding=utf-8
import math


class Hole(object):
    """
    Абстрактная дырка в вашем коде
    """
    def __init__(self, r):
        # задаем радиус дыры
        self.r = r

    def put(self, obj):
        # пытаемся поместить
        try:
            # чтобы влезло, нужно,
            # чтобы радиус дырки позволял
            if self.r >= obj.r:
                print u'Лезет!'
            else:
                print u'Не лезет'
        except AttributeError:
            print (u'Переданный объект не умеет вычислять радиус дырки,' 
                   u' в которую он влезет! Напишите Адаптер на python!')


class Square(object):
    """
    Абстрактный квадратный кол, который позволит
    закрыть абстрактную дырку в коде
    """
    def __init__(self, x, h):
        # зададим параметры дрына
        self.x = x
        self.h = h


class SquareHoleAdapter(object):
    def __init__(self, sq_obj):
        self.sq_obj = sq_obj

    @property
    def r(self):
        # половина диагонали квадрата будет как раз влезать
        # в дырку радиусом с полученное значение
        return math.sqrt(2*(self.sq_obj.x**2))/2


h1 = Hole(5)
h2 = Hole(2)
s1 = Square(5, 7)
s2 = Square(3, 3)
sa = SquareHoleAdapter(s2)

h1.put(s1)
>>> Переданный объект не умеет вычислять радиус дырки, в которую он влезет! Напишите Адаптер на python!

h1.put(sa)
>>> Лезет!

h2.put(sa)
>>> Не лезет

Пример реализации Singleton python

Пример порождающего паттерна singletoon на python

Основная мысль:
1. Гарантирует, что у класса есть только один экземпляр!
2. Предоставляет глобальную точку доступа (в отличии от переменных, их можно переписывать)

По сути нужно перекрыть метод, который создает объект __new__

class Singleton(object):

    def __new__(cls):
        # Перекрываем создание объекта класса
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance


s = Singleton()
print id(s)
print s

b = Singleton()
print id(b)
print b

print (s is b)

# Вывод:
# 140425907838864
# <__main__.Singleton object at 0x7fb7745a9f90>
# 140425907838864
# <__main__.Singleton object at 0x7fb7745a9f90>
# True