Onga inc

subtitle

js_desain_single

Singleton

①あるクラスのインスタンスを一つだけ作成可能である。
②同じクラスを使って新しいオブジェクトを再度作成すると、最初に作ったオブジェクトの参照になる。
③作られたオブジェクトへのグローバルなアクセス方法を提供する

1
2
3
var Single = {
myName: 'Singleton'
};
1
2
3
4
5
function Singleton () {
this.myName = 'Singleton';
}
var single = new Singleton(); // new を使ってSingleton オブジェクトを作成する
console.log(single.myName); // Singleton
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Singleton () {

// すでにSingleton.instance が存在する場合にはSingleton.instance を返す

if(typeof Singleton.instance === 'object') {
return Singleton.instance;
}

this.myName = 'Singleton';

// Singleton.instance は自身を参照する。
Singleton.instance = this;

return this;
}

var obj1 = new Singleton(); // new を使ってSingletonオブジェクトを作成する
var obj2 = new Singleton(); // new を使ってSingletonオブジェクトを作成する
console.log(obj1 === obj2); // true 2つは同じオブジェクト
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
var Singleton = (function() {
// ここは外側からアクセスできない機能

var instance;

function init() {
// オブジェクトを返す
return {
prop: 1,
sayHoge: function() {
console.log('hoge');
}
}
}

return {
getInstance: function() {
if(!instance) {
instance = init(); // globalのinstanceがなければ init()
}
return instance; // globalなinstance
}
}

})();

var obj1 = Singleton.getInstance();
var obj2 = Singleton.getInstance();

// obj1とobj2は同じオブジェクト
console.log(obj1 === obj2); // true
console.log(obj1.prop); // 1;
console.log(obj2.prop); // 1;

// 同一オブジェクトなのでobj2の値を変えるとobj1も変わる
obj2.prop = 3;
console.log(obj1.prop); // 3;
console.log(obj2.prop); // 3;

Onga

A designer, developer and entrepreneur. Spends his time travelling the world with a bag of kites. Likes journalism and publishing platforms.

Comments