-
Notifications
You must be signed in to change notification settings - Fork 0
/
singleton-pattern.html
117 lines (98 loc) · 8.08 KB
/
singleton-pattern.html
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Singleton Pattern</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="/theme/images/fırat_ugur_gursoy.png">
<link href='http://fonts.googleapis.com/css?family=Josefin+Slab' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/theme/css/main.css" />
<link rel="stylesheet" href="/theme/css/prettify.css" />
</head>
<body class="body ">
<header>
<div class="content">
<a href="/" class="title"> Erdem Özkol </a>
<nav>
<a href="/">blog</a>
<a href="/me">me</a>
<a href="https://github.com/erdem/">github</a>
<a href="mailto:[email protected]">contact</a>
</nav>
</div>
</header>
<main>
<div class="content">
<article class="post">
<div class="post-info">
<span class="date">18 August 2015</span>
<h2 class="title">Singleton Pattern</h2>
</div>
<p>Sometimes we need one global object and use it in our application. Creating multiple instances for this object may create errors. especially errors about atomicity, integrity. So on those cases, we use Singleton pattern. We create the object once, initialize it than use it.</p>
<p><strong>Wikipedia:</strong>
<em>In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system.</em></p>
<h3>Example:</h3>
<p>Let's assume we load our application configuration from Settings class. This class reads configuration from file. So when we create settings instance we should read configuration once and set variables once, return the instance. If we call settings instance again it should return variables without reading the configuration file.</p>
<p><strong style="font-size:16px;color:#6C6C6C">settings.py</strong></p>
<div class="highlight"><pre><span></span>DOMAIN = "http://www.erdemozkol.com"
AUTHOR_NAME = "Erdem Ozkol"
DATE_FORMAT = "%A %d. %B %Y"
</pre></div>
<p><strong style="font-size:16px;color:#6C6C6C">singleton.py</strong></p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">settings</span>
<span class="k">class</span> <span class="nc">Singleton</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">klass</span> <span class="o">=</span> <span class="n">klass</span> <span class="c1"># class which is being decorated</span>
<span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># instance of that class</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="c1"># new instance is created and stored for future use</span>
<span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">klass</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">print</span> <span class="s2">"New instace created!"</span>
<span class="k">print</span> <span class="s2">"Returning stored instance"</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span>
<span class="nd">@Singleton</span>
<span class="k">class</span> <span class="nc">Settings</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">module</span><span class="p">):</span>
<span class="c1"># get all variable in settings.py and update the class attributes</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
<span class="n">s1</span> <span class="o">=</span> <span class="n">Settings</span><span class="p">(</span><span class="n">module</span><span class="o">=</span><span class="n">settings</span><span class="p">)</span>
<span class="o">>>></span> <span class="s2">"New instace created!"</span>
<span class="o">>>></span> <span class="s2">"Returning stored instance"</span>
<span class="n">s2</span> <span class="o">=</span> <span class="n">Settings</span><span class="p">(</span><span class="n">module</span><span class="o">=</span><span class="n">settings</span><span class="p">)</span>
<span class="o">>>></span> <span class="s2">"Returning stored instance"</span>
<span class="n">s3</span> <span class="o">=</span> <span class="n">Settings</span><span class="p">(</span><span class="n">module</span><span class="o">=</span><span class="n">settings</span><span class="p">)</span>
<span class="o">>>></span> <span class="s2">"Returning stored instance"</span>
</pre></div>
<p>Bu implemention da ki class'lar yaptığı görevlere bir bakalım. Unit classından türetilen objeler observer class instance na register olduktan sonra objserver class bu unit'lere event gönderiyor. Yani tüm unit class'larini observer üzerinden dağıtık bir şekilde yönetebiliyoruz.</p>
<p><sup><strong><em>References:</em></strong><sup></p>
<ul>
<li><sup><a href="https://en.wikipedia.org/wiki/Singleton_pattern">https://en.wikipedia.org/wiki/Singleton_pattern</a><sup></li>
<li><sup><a href="https://anismiles.wordpress.com/2011/05/">https://anismiles.wordpress.com/2011/05/</a><sup></li>
<li><sup><a href="http://elbenshira.com/blog/singleton-pattern-in-python/">http://elbenshira.com/blog/singleton-pattern-in-python/</a><sup></li>
</ul>
</article>
</div>
</main>
<footer>
<div class="content">
<ul>
<li><strong>email</strong> <a href="mailto:[email protected]">[email protected]</a></li>
<li><strong>github</strong> <a href="http://github.com/erdem">github.com/erdem</a></li>
<li><strong>twitter</strong> <a href="http://twitter.com/erdemozkol">twitter.com/erdemozkol</a></li>
<li><strong>linkedin</strong> <a href="https://www.linkedin.com/in/erdemozkol/">linkedin.com/erdemozkol</a></li>
</ul>
</div>
</footer>
<script type="text/javascript" src="/theme/js/prettify.js"></script>
<script type="text/javascript">
var pre_elements = document.getElementsByTagName("pre");
for (var i = 0; i < pre_elements.length; i++){
pre_elements[i].className = "prettyprint";
}
prettyPrint();
</script>
</body>
</html>