\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{sercand} \pdfinfo{ /Title (python-design-patterns.pdf) /Creator (Cheatography) /Author (sercand) /Subject (Python Design Patterns Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{A3A3A3} \definecolor{LightBackground}{HTML}{F3F3F3} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{Python Design Patterns Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{sercand} via \textcolor{DarkBackground}{\uline{cheatography.com/32560/cs/10035/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}sercand \\ \uline{cheatography.com/sercand} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Published 2nd December, 2016.\\ Updated 2nd December, 2016.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{3} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Singleton}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{def Singleton(cls): \newline \_instances = \{\} \newline def getinstance(): \newline if cls not in \_instances: \newline \_instances{[}cls{]} = cls() \newline return \_instances{[}cls{]} \newline return getinstance \newline \newline @Singleton \newline class Counter(object): \newline def \_\_init(self): \newline if not hasattr(self ,'val'): self.val = 0 \newline def get(self): return self.val \newline def incr(self): self.val += 1} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Factory}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{@Singleton \newline class PlayerFactory(object): \newline def new(self, name, type): \newline if type == 'peasant': \newline return Peasant(name) \newline elif type == 'warior': \newline return Warior(name) \newline return None} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Proxy}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{class CounterProxy(object): \newline def \_\_init\_\_(self, type): \newline self.type = type \newline def incr(self): \newline if self.type == 'W': \newline Counter().incr() \newline def get(self): \newline Counter().get()} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Producer}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{class Producer(Thread): \newline \newline def \_\_init\_\_(self, queue, cvs, maxsize=5): \newline \seqsplit{Thread.\_\_init\_\_(self)} \newline self.queue = queue \newline self.maxsize = maxsize \newline self.notfull = cvs{[}0{]} \newline self.notempty = cvs{[}1{]} \newline self.terminate = False \newline self.counter = 0 \newline \newline def run(self): \newline while not self.terminate: \newline sleep(0.1 * randint(0, 10)) \# sleep randomly \newline \newline self.notfull.acquire() \newline while len(self.queue) \textgreater{}= self.maxsize: \# full \newline print "full queue, waiting" \newline self.notfull.wait() \newline if self.terminate: \newline break \newline self.notfull.release() \newline self.counter += 1 \newline \seqsplit{self.queue.append(self.counter)} \newline self.notempty.acquire() \newline self.notempty.notify() \# notify consumer, a new item \newline self.notempty.release() \newline \newline def quit(self): \newline self.terminate = True \newline self.notfull.acquire() \newline self.notfull.notify() \newline self.notfull.release()} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Observer}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{class Subject(object): \newline \_observers = {[}{]} \newline def register(self, obs): \newline \seqsplit{self.\_observers.append(obs)} \newline def unregister(self, obs): \newline \seqsplit{self.\_observers.remove(obs)} \newline def notify(self): \newline for o in self.\_observers: \newline o.update(self) \newline def state(self): pass \newline class Observer(object): \newline def update(self, subj): pass \newline class Clock(Subject): \newline def \_\_init\_\_(self): \newline self.value = 0 \newline def state(self): \newline return self.value \newline def tick(self): \newline self.value += 1 \newline self.notify() \newline class Person(Observer): \newline def update(self, obj): \newline print "heyo", obj.state() \newline a = Person() \newline b = Clock() \newline b.register(a) \newline b.tick()} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{facade}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{class AuthFacade(object): \newline def \_\_init\_\_(self ,method): \newline if method == 'passwd': \newline \# \newline elif method =='oauth': \newline \# \newline elif method =='otp': \newline \# \newline else: \newline throw ... \newline def auth(self,identity,data): \newline \#check authentication based on setting} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Consumer}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{class Consumer(Thread): \newline def \_\_init\_\_(self, queue, cvs): \newline \seqsplit{Thread.\_\_init\_\_(self)} \newline self.queue = queue \newline self.notfull = cvs{[}0{]} \newline self.notempty = cvs{[}1{]} \newline self.terminate = False \newline def run(self): \newline while not self.terminate: \newline sleep(0.1 * randint(0, 10)) \# sleep randomly \newline self.notempty.acquire() \newline while len(self.queue) == 0: \# empty \newline print "empty queue, waiting" \newline self.notempty.wait() \newline if self.terminate: \newline break \newline self.notempty.release() \newline item = self.queue{[}0{]} \newline del self.queue{[}0{]} \newline print "consumed ", item \newline self.notfull.acquire() \newline self.notfull.notify() \# notify consumer, a new item \newline self.notfull.release() \newline def quit(self): \newline self.terminate = True \newline self.notempty.acquire() \newline self.notempty.notify() \newline self.notempty.release()} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{x{2.4885 cm} x{2.4885 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{5.377cm}}{\bf\textcolor{white}{patterns}} \tn % Row 0 \SetRowColor{LightBackground} A complex library, tool or system; consisting of many functions and/or classes; probably poorly designed is tried to be accessed. It is hard to read and understand. There are many dependencies distributed in the source, needs many housekeeping tasks and stages to access. Any change in the system require changes in the whole source code. & Facade:Define a class implementing all details of the library/system and providing a simple uniform interface. Access the library through this interface. \tn % Row Count 17 (+ 17) % Row 1 \SetRowColor{white} You need to access a hard to duplicate, limited, probably old class definition. You donot have a chance to improve it or change the interface. Or, you want to have restricted access to methods (authorization). Or, you want smarter access like caching. & Proxy: Write a class interface implementing functionalities missing in the original interface. \tn % Row Count 30 (+ 13) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{5.377cm}{x{2.4885 cm} x{2.4885 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{5.377cm}}{\bf\textcolor{white}{patterns (cont)}} \tn % Row 2 \SetRowColor{LightBackground} Objects depending on eachothers states need to be informed when the other encountered a change. Event handling systems. & Observer: Maintain a registry of observing objects in Subject object. When an event occurs, notify the observers. \tn % Row Count 6 (+ 6) % Row 3 \SetRowColor{white} Create objects from a set of classes. Implementation depends on class definitions. Introduction of new classes and other changes need recompilation. Class constructors exposed. & Factory: Use interface functions/objects to encapsulate class names and constructors. Use a interface functions, methods to provide you instances. Rest is handled by polymorphism. \tn % Row Count 15 (+ 9) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}