แนะนำ
เริ่มต้นจากบทนี้เราจะค่อยๆแนะนำการใช้งานรูปแบบการออกแบบต่างๆที่ใช้ใน JavaScript ที่นี่ฉันจะไม่แนะนำทฤษฎีของรูปแบบมากเกินไป แต่จะมุ่งเน้นไปที่การใช้งานเท่านั้น ตกลงเริ่มต้นอย่างเป็นทางการ
ในสายตาของวิศวกรการพัฒนาแบบดั้งเดิมซิงเกิลตันคือเพื่อให้แน่ใจว่ามีเพียงตัวอย่างเดียวของชั้นเรียน วิธีการดำเนินการโดยทั่วไปจะต้องพิจารณาว่าอินสแตนซ์มีอยู่ก่อนหรือไม่ หากมีอยู่มันจะถูกส่งคืนโดยตรงและหากไม่มีอยู่มันจะถูกสร้างขึ้นแล้วส่งคืนซึ่งทำให้มั่นใจได้ว่ามีเพียงวัตถุอินสแตนซ์เดียวของคลาส ใน JavaScript Singleton ทำหน้าที่เป็นผู้ให้บริการเนมสเปซซึ่งเป็นจุดเชื่อมต่อที่ไม่ซ้ำกันจากเนมสเปซทั่วโลกเพื่อเข้าถึงวัตถุ
ข้อความ
ใน JavaScript มีหลายวิธีในการใช้ Singletons วิธีที่ง่ายที่สุดคือการใช้วัตถุที่แท้จริงซึ่งสามารถมีคุณสมบัติและวิธีการจำนวนมาก:
การคัดลอกรหัสมีดังนี้:
var mysingleton = {
อสังหาริมทรัพย์ 1: "บางสิ่งบางอย่าง",
Property2: "อย่างอื่น",
วิธีการที่ 1: ฟังก์ชัน () {
console.log ('Hello World');
-
-
หากคุณต้องการขยายวัตถุในภายหลังคุณสามารถเพิ่มสมาชิกส่วนตัวและวิธีการของคุณเองจากนั้นใช้การปิดเพื่อห่อหุ้มตัวแปรและการประกาศฟังก์ชั่นเหล่านี้ภายใน เฉพาะสมาชิกสาธารณะและวิธีการที่คุณต้องการเปิดเผยเท่านั้น รหัสตัวอย่างมีดังนี้:
การคัดลอกรหัสมีดังนี้:
var mysingleton = function () {
/* ประกาศตัวแปรส่วนตัวและวิธีการที่นี่*/
var privateVariable = 'Something Private';
ฟังก์ชั่น showprivate () {
console.log (PrivateVariable);
-
/ * ตัวแปรและวิธีการสาธารณะ (ตัวแปรส่วนตัวและวิธีการสามารถเข้าถึงได้) */
กลับ {
PublicMethod: function () {
Showprivate ();
-
Publicvar: 'ประชาชนสามารถเห็นสิ่งนี้ได้!'
-
-
var single = mysingleton ();
Single.publicMethod (); // เอาท์พุท 'บางสิ่งบางอย่างส่วนตัว'
console.log (single.publicvar); // output 'ประชาชนสามารถเห็นสิ่งนี้!'
รหัสข้างต้นค่อนข้างดี แต่ถ้าเราต้องการทำมันจะเริ่มต้นเฉพาะเมื่อเราใช้มันเท่านั้น เพื่อวัตถุประสงค์ในการประหยัดทรัพยากรเราสามารถเริ่มต้นรหัสเหล่านี้ในตัวสร้างอื่นดังนี้:
การคัดลอกรหัสมีดังนี้:
var singleton = (function () {
VAR อินสแตนซ์;
ฟังก์ชัน init () {
/*กำหนดรหัสซิงเกิลตันที่นี่*/
กลับ {
PublicMethod: function () {
console.log ('Hello World');
-
PublicProperty: 'ทดสอบ'
-
-
กลับ {
getInstance: function () {
ถ้า (! อินสแตนซ์) {
อินสแตนซ์ = init ();
-
กลับอินสแตนซ์;
-
-
-
/*เรียกวิธีสาธารณะเพื่อรับอินสแตนซ์:*//
Singleton.getInstance (). PublicMethod ();
ฉันรู้วิธีใช้ซิงเกิลตัน แต่สถานการณ์แบบไหนเป็นสถานการณ์ที่ดีที่สุดสำหรับการใช้ซิงเกิล ในความเป็นจริงโดยทั่วไปจะใช้สำหรับการประสานงานการสื่อสารระหว่างโหมดต่าง ๆ ระหว่างระบบ รหัสต่อไปนี้เป็นแนวปฏิบัติที่ดีที่สุดสำหรับซิงเกิลตัน:
การคัดลอกรหัสมีดังนี้:
var singletontester = (function () {
// พารามิเตอร์: ชุดพารามิเตอร์ที่ส่งผ่านไปยังซิงเกิลตัน
ฟังก์ชั่น Singleton (args) {
// ตั้งค่าตัวแปร args เป็นพารามิเตอร์ที่ได้รับหรือว่างเปล่า (ถ้าไม่ได้ให้ไว้)
var args = args || -
// ตั้งค่าพารามิเตอร์ชื่อ
this.name = 'singletontester';
// ตั้งค่า pointx
this.pointx = args.pointx || 6; // รับจากพารามิเตอร์ที่ได้รับหรือตั้งค่าเป็นค่าเริ่มต้น
// ตั้งค่าของ Pointy
this.pointy = args.pointy || 10;
-
// อินสแตนซ์คอนเทนเนอร์
อินสแตนซ์ var;
var _static = {
ชื่อ: 'Singletontester',
// วิธีการรับอินสแตนซ์
// ส่งคืนอินสแตนซ์ซิงเกิล
getInstance: ฟังก์ชั่น (args) {
ถ้า (อินสแตนซ์ === ไม่ได้กำหนด) {
อินสแตนซ์ = ใหม่ซิงเกิล (args);
-
อินสแตนซ์กลับ;
-
-
กลับ _static;
-
var singletontest = singletontester.getInstance ({pointx: 5});
console.log (singletontest.pointx); // เอาต์พุต 5
วิธีการใช้งานอื่น ๆ
วิธีที่ 1:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชันจักรวาล () {
// พิจารณาว่ามีอินสแตนซ์หรือไม่
if (typeof universe.instance === 'Object') {
กลับมาจักรวาล. Instance;
-
// เนื้อหาอื่น ๆ
this.start_time = 0;
this.bang = "ใหญ่";
// แคช
Universe.instance = this;
// ส่งคืนสิ่งนี้โดยปริยาย
-
// ทดสอบ
var uni = ใหม่จักรวาล ();
var uni2 = จักรวาลใหม่ ();
console.log (uni === uni2); // จริง
วิธีที่ 2:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชันจักรวาล () {
// อินสแตนซ์แคช
var instance = this;
// เนื้อหาอื่น ๆ
this.start_time = 0;
this.bang = "ใหญ่";
// เขียนตัวสร้างใหม่
Universe = function () {
อินสแตนซ์กลับ;
-
-
// ทดสอบ
var uni = ใหม่จักรวาล ();
var uni2 = จักรวาลใหม่ ();
uni.bang = "123";
console.log (uni === uni2); // จริง
console.log (uni2.bang); // 123
วิธีที่ 3:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชันจักรวาล () {
// อินสแตนซ์แคช
อินสแตนซ์ var;
// สร้างฟังก์ชั่นใหม่
Universe = function universe () {
อินสแตนซ์กลับ;
-
// หลังการประมวลผลคุณสมบัติต้นแบบ
Universe.prototype = this;
// ตัวอย่าง
อินสแตนซ์ = ใหม่จักรวาล ();
// รีเซ็ตตัวชี้ตัวสร้าง
อินสแตนซ์. constructor = จักรวาล;
// ฟังก์ชั่นอื่น ๆ
Instance.start_time = 0;
instance.bang = "big";
อินสแตนซ์กลับ;
-
// ทดสอบ
var uni = ใหม่จักรวาล ();
var uni2 = จักรวาลใหม่ ();
console.log (uni === uni2); // จริง
// เพิ่มคุณสมบัติต้นแบบ
Universe.prototype.nothing = true;
var uni = ใหม่จักรวาล ();
universe.prototype.everything = true;
var uni2 = จักรวาลใหม่ ();
console.log (Uni.nothing); // จริง
console.log (uni2.nothing); // จริง
console.log (uni.everything); // จริง
console.log (uni2.illherthing); // จริง
console.log (Uni.Constructor === จักรวาล); // จริง
วิธีที่ 4:
การคัดลอกรหัสมีดังนี้:
Var Universe;
(การทำงาน () {
อินสแตนซ์ var;
Universe = function universe () {
ถ้า (อินสแตนซ์) {
อินสแตนซ์กลับ;
-
อินสแตนซ์ = สิ่งนี้;
// เนื้อหาอื่น ๆ
this.start_time = 0;
this.bang = "ใหญ่";
-
-
// รหัสทดสอบ
var a = จักรวาลใหม่ ();
var b = จักรวาลใหม่ ();
การแจ้งเตือน (a === b); // จริง
A.bang = "123";
การแจ้งเตือน (b.bang); // 123