Latest web development tutorials
×

设计模式 หลักสูตร

รูปแบบการออกแบบ รู้เบื้องต้นเกี่ยวกับรูปแบบการออกแบบ โหมดโรงงาน แบบโรงงานย่อ รูปแบบเดี่ยว รุ่นสร้าง รุ่นต้นแบบ อะแดปเตอร์รุ่น สะพานโหมด รูปแบบตัวกรอง โหมดการทำงานร่วมกัน มัณฑนากร รูปแบบซุ้ม ฟลายเวท โหมดพร็อกซี่ ห่วงโซ่ของรูปแบบความรับผิดชอบ โหมดคำสั่ง รูปแบบล่าม โหมดซ้ำแล้วซ้ำอีก รูปแบบที่เป็นสื่อกลาง รูปแบบของที่ระลึก รูปแบบการสังเกตการณ์ รูปแบบของรัฐ null Object Model โหมดกลยุทธ์ โหมดแม่แบบ รูปแบบของผู้เข้าชม MVC โหมด โหมดตัวแทน โหมดนิติบุคคลองค์ประกอบ รูปแบบการเข้าถึงข้อมูลของวัตถุ รูปแบบการควบคุมด้านหน้า intercepting รูปแบบตัวกรอง รูปแบบการบริการผู้แทนจำหน่าย วัตถุ Transfer รุ่น

设计模式其他

ทรัพยากรโหมดออกแบบ

รูปแบบเดี่ยว

โทน (แบบเดี่ยว) Java เป็นหนึ่งในรูปแบบการออกแบบที่ง่ายที่สุด ประเภทของรูปแบบการออกแบบนี้เป็นของสร้างสกีซึ่งมีวิธีที่ดีที่สุดในการสร้างวัตถุ

รุ่นนี้เกี่ยวข้องกับชั้นเดียวที่มีหน้าที่รับผิดชอบในการสร้างวัตถุของคุณเองในขณะที่มั่นใจว่ามีเพียงวัตถุเดียวที่ถูกสร้างขึ้น ชั้นนี้ยังมีวัตถุที่ไม่ซ้ำกันของการเยี่ยมชมของพวกเขาก็สามารถเข้าถึงได้โดยตรงที่คุณไม่จำเป็นต้องยกตัวอย่างวัตถุของคลาสที่

หมายเหตุ:

  • 1 ชั้นเดี่ยวสามารถมีได้เพียงหนึ่งตัวอย่าง
  • 2 ชั้นเดี่ยวต้องสร้างตัวอย่างเป็นเอกลักษณ์ของตนเอง
  • 3 ชั้นเดี่ยวจะต้องให้ตัวอย่างนี้กับวัตถุอื่น ๆ ทั้งหมด

การแนะนำ

เจตนา: เพื่อให้มั่นใจว่ามีเพียงหนึ่งตัวอย่างของการเรียนและการให้บริการจุดการเข้าถึงทั่วโลกเพื่อเข้าใช้งานได้

วิธีการแก้ปัญหาหลัก: ใช้ระดับโลกที่สร้างขึ้นบ่อยครั้งและทำลาย

เมื่อจะใช้: เมื่อคุณต้องการที่จะควบคุมจำนวนของกรณีที่เมื่อเพื่อประหยัดทรัพยากรระบบ

วิธีการแก้ปัญหา: การพิจารณาว่าระบบมีอยู่แล้วนี้กรณีเดียวถ้ามันกลับมาถ้าไม่ได้สร้างแล้ว

รหัสสำคัญ: สร้างความเป็นส่วนตัว

ตัวอย่างการใช้งาน: 1, บุคคลที่สามารถมีได้เพียงหนึ่งประธาน2, Windows เป็นกระบวนการหลายแบบมัลติเธรดในการดำเนินงานของไฟล์เมื่อกระบวนการหลายอย่างหลีกเลี่ยงหรือกระทู้พร้อมกันเอกสารของปรากฏการณ์การประมวลผลของไฟล์ทั้งหมดที่ต้องดำเนินการโดยอินสแตนซ์ที่ไม่ซ้ำกัน 3 บางส่วนของผู้จัดการอุปกรณ์ที่ถูกออกแบบมามักจะเป็นรูปแบบเดียวกรณีเช่นคอมพิวเตอร์ที่มีสองเครื่องพิมพ์ในการส่งออกเมื่อมีความจำเป็นที่จะจัดการกับสองเครื่องพิมพ์ไม่สามารถพิมพ์ไฟล์เดียวกัน

ข้อดี: 1, เพียงหนึ่งตัวอย่างในหน่วยความจำลดค่าใช้จ่ายของหน่วยความจำที่พบบ่อยโดยเฉพาะอย่างยิ่งการสร้างและทำลายกรณี (เช่นโรงเรียนแคชหน้าการจัดการบ้าน)2 เพื่อหลีกเลี่ยงการเข้าพักหลายของทรัพยากร (เช่นการดำเนินงานไฟล์เขียน)

จุดด้อย: อินเตอร์เฟซที่ไม่ได้รับมรดกและความรับผิดชอบต่อความขัดแย้งเดียวหลักการชั้นเรียนควรจะกังวลเกี่ยวกับตรรกะภายในไม่ได้อยู่นอกเช่นวิธีการยกตัวอย่าง

สถานการณ์การใช้งาน: 1, ต้องมีการผลิตของหมายเลขที่ไม่ซ้ำกัน2, เคาน์เตอร์เว็บไม่ได้ฐานข้อมูลทั้งหมดในริกาครั้งกับกรณีเดียวที่จะฟื้นฟูแคช 3 วัตถุที่สร้างขึ้นโดยความจำเป็นในการบริโภคมากเกินไปทรัพยากรเช่นฉันเชื่อมต่อ / O ไปยังฐานข้อมูลและอื่น ๆ

หมายเหตุ: getInstance () วิธีการต้องใช้การประสานข้อมูลให้ตรงกันล็อค (Singleton.class) เพื่อป้องกันไม่ให้เข้ามาในหลายหัวข้อเช่นสาเหตุที่ยกตัวอย่างหลายครั้ง

การสำนึก

เราจะสร้างชั้นSingleObjectระดับSingleObjectมีคอนสตรัคส่วนตัวของตัวเองและอินสแตนซ์แบบคงที่

ระดับSingleObjectมีวิธีการแบบคงที่สำหรับการได้รับนอกเช่นคงที่SingletonPatternDemo เรียนสาธิตของเราโดยใช้ระดับSingleObject ที่จะได้รับวัตถุSingleObject

รูปแบบเดี่ยวแผนภาพ UML

ขั้นตอนที่ 1

สร้างชั้นเดี่ยว

SingleObject.java

SingleObject คลาสที่สาธารณะ {

   // สร้างวัตถุ SingleObject ส่วนตัวเช่น SingleObject คง = SingleObject ใหม่ ();

   // ให้เอกชนปลูกสร้างเพื่อการเรียนจะไม่ถูก instantiated SingleObject ส่วนตัว () {}

   // รับวัตถุเพียงอย่างเดียวของสาธารณะที่มีอยู่คง SingleObject getInstance () {
      กลับเช่น;
   }

   โมฆะสาธารณะ ShowMessage () {
      System.out.println ( "Hello World!");
   }
}

ขั้นตอนที่ 2

รับวัตถุที่ไม่ซ้ำกันจากชั้นเดี่ยว

SingletonPatternDemo.java

SingletonPatternDemo คลาสที่สาธารณะ {
   ประชาชนเป็นโมฆะคง main (String args []) {

      // // สร้างผิดกฎหมายรวบรวมข้อผิดพลาดเวลา: สร้าง SingleObject () ไม่สามารถมองเห็นวัตถุ // SingleObject = SingleObject ใหม่ ();

      // รับวัตถุเพียงวัตถุที่มีอยู่ SingleObject = SingleObject.getInstance ();

      // แสดงการ object.showMessage ();
   }
}

ขั้นตอนที่ 3

ตรวจสอบการส่งออก

สวัสดีชาวโลก!

หลายรูปแบบการดำเนินซิงเกิล

ใช้รูปแบบเดี่ยวหลายวิธีดังต่อไปนี้:

1 รูปแบบขี้เกียจด้ายปลอดภัย

มีการเริ่มต้นขี้เกียจ: ใช่

มีความปลอดภัยด้ายหลาย: ไม่มี

บรรลุความยาก: ง่าย

คำอธิบาย: วิธีการนี้เป็นวิธีพื้นฐานที่สุดเพื่อให้บรรลุการดำเนินงานนี้ปัญหาใหญ่ที่สุดคือไม่สนับสนุนมัลติเธรดเนื่องจากมีการล็อคไม่ตรงกันดังนั้นความเข้มงวดมันไม่ได้เป็นเดี่ยว
โหลดขี้เกียจในลักษณะนี้เห็นได้ชัดว่าไม่จำเป็นต้องมีความปลอดภัยหัวข้อการทำงานในแบบมัลติเธรดไม่ทำงาน

ตัวอย่างรหัสสินค้า:

เรียนสาธารณะ Singleton {  
    อินสแตนซ์ซิงเกิลส่วนตัวคง;  
    ส่วนตัวโทน () {}  
  
    สาธารณะคงซิงเกิล getInstance () {  
    ถ้า (เช่น == null) {  
        ตัวอย่าง = ใหม่ซิงเกิล ();  
    }  
    กลับเช่น;  
    }  
}  

นำเสนอต่อไปของการใช้งานหลายสนับสนุนหลายหัวข้อ แต่แตกต่างกันในการปฏิบัติงาน

2 สไตล์ขี้เกียจด้ายปลอดภัย

มีการเริ่มต้นขี้เกียจ: ใช่

มีความปลอดภัยด้ายหลาย: ใช่

บรรลุความยาก: ง่าย

คำอธิบาย: ในลักษณะนี้มีการโหลดขี้เกียจที่ดีสามารถทำงานได้ดีในด้ายหลาย แต่เป็นมีประสิทธิภาพต่ำมาก 99% ของผู้ป่วยไม่จำเป็นต้องมีการประสาน
ประโยชน์: สายแรกคือการเริ่มต้นที่จะหลีกเลี่ยงการสูญเสียหน่วยความจำ
ข้อเสีย: ต้องถูกล็อคตรงกันเพื่อให้แน่ใจว่าเป็นกรณีเดียว แต่ล็อคจะส่งผลกระทบต่อประสิทธิภาพ
getInstance () ประสิทธิภาพการทำงานของแอพลิเคชันที่ไม่สำคัญ (ซึ่งใช้น้อยบ่อย)

ตัวอย่างรหัสสินค้า:

เรียนสาธารณะ Singleton {  
    อินสแตนซ์ซิงเกิลส่วนตัวคง;  
    ส่วนตัวโทน () {}  
    สาธารณะคงตรงกันซิงเกิล getInstance () {  
    ถ้า (เช่น == null) {  
        ตัวอย่าง = ใหม่ซิงเกิล ();  
    }  
    กลับเช่น;  
    }  
} 

3 สูตรที่หิวโหย

มีการเริ่มต้นขี้เกียจ: ไม่มี

มีความปลอดภัยด้ายหลาย: ใช่

บรรลุความยาก: ง่าย

คำอธิบาย: เป็นเรื่องปกติมากขึ้น แต่มีแนวโน้มที่จะวัตถุขยะ
ข้อดี: ไม่ได้ล็อคมีประสิทธิภาพดีขึ้น
ข้อเสีย: กระบอกชั้นจะเริ่มต้นหน่วยความจำจะสูญเสีย
มันขึ้นอยู่กับกลไกการหลีกเลี่ยง classloder multithreading ประสานอย่างไรเช่นเมื่อมีการยกตัวอย่างกระบอกชั้นแม้ว่าระดับสาเหตุโหลดหลากหลายเหตุผลส่วนใหญ่ของรูปแบบเดี่ยวคือการเรียกวิธี getInstance แต่ก็ไม่สามารถระบุได้ มีวิธีอื่น ๆ (หรือวิธีการอื่น ๆ คงที่) จะนำไปสู่การโหลดระดับคราวนี้เห็นได้ชัดว่าไม่ถึงเช่นการเริ่มต้นผลโหลดขี้เกียจ

ตัวอย่างรหัสสินค้า:

เรียนสาธารณะ Singleton {  
    คง instance ส่วนตัวซิงเกิลใหม่ซิงเกิล = ();  
    ส่วนตัวโทน () {}  
    สาธารณะคงซิงเกิล getInstance () {  
    กลับเช่น;  
    }  
}  

4 ล็อคตรวจสอบอีกครั้ง / ล็อคการตรวจสอบคู่ (DCL ที่เป็นสองตรวจสอบการล็อก)

รุ่น JDK: jdk1.5 จาก

มีการเริ่มต้นขี้เกียจ: ใช่

มีความปลอดภัยด้ายหลาย: ใช่

ตระหนักถึงความยากลำบาก: ที่ซับซ้อนมากขึ้น

คำอธิบาย: วิธีการนี้ใช้กลไกดับเบิลล็อคความปลอดภัยและในกรณีของแบบมัลติเธรดในการรักษาที่มีประสิทธิภาพสูง
getInstance () ประสิทธิภาพการใช้งานที่มีความสำคัญ

ตัวอย่างรหัสสินค้า:

เรียนสาธารณะ Singleton {  
    ส่วนตัวคงมีความผันผวนซิงเกิลเดี่ยว;  
    ส่วนตัวโทน () {}  
    สาธารณะคงซิงเกิล getSingleton () {  
    ถ้า (Singleton == null) {  
        ตรงกัน (Singleton.class) {  
        ถ้า (Singleton == null) {  
            ซิงเกิลใหม่ซิงเกิล = ();  
        }  
        }  
    }  
    กลับเดี่ยว;  
    }  
}  

5 ประเภทการลงทะเบียนเรียน / ภายในแบบคงที่

มีการเริ่มต้นขี้เกียจ: ใช่

มีความปลอดภัยด้ายหลาย: ใช่

ตระหนักถึงความยากลำบาก: ทั่วไป

คำอธิบาย: วิธีการนี้สามารถบรรลุโหมดล็อคผลเช่นเดียวกันตรวจสอบอีกครั้ง แต่การดำเนินงานได้ง่ายขึ้นเริ่มต้นใช้ขี้เกียจของสนามคงที่ควรจะใช้วิธีนี้แทนการตรวจสอบโหมดล็อค นี้จะใช้กับกรณีของสนามคงตรวจสอบอีกครั้งโหมดล็อคสามารถนำมาใช้เมื่อมีความจำเป็นในการเริ่มต้นล่าช้าเช่นสาขา
วิธีนี้ยังใช้ประโยชน์จากกลไก classloder เพื่อให้มั่นใจว่าด้ายหนึ่งเช่นการเริ่มต้นเท่านั้นที่จะมี 3 วิธีที่แตกต่างกันคือ: ตราบใดที่วิธีที่สามระดับซิงเกิลโหลดอินสแตนซ์อินสแตนซ์ (ไม่ถึงโหลดขี้เกียจ ผล) แต่วิธีการนี้เป็นชั้นซิงเกิลโหลดตัวอย่างเช่นอาจจะไม่ได้เริ่มต้น เพราะระดับ SingletonHolder ไม่ได้ถูกใช้อย่างแข็งขันแสดงเพียงผ่านวิธีการโทร getInstance ปรากฏระดับ SingletonHolder โหลดซึ่งเป็นอินสแตนซ์อินสแตนซ์ ลองคิดดูถ้าคุณยกตัวอย่างเช่นทรัพยากรมากดังนั้นจึงอยากที่จะชะลอการโหลดบนมืออื่น ๆ เมื่อคุณไม่ต้องการที่จะยกตัวอย่างรถตักดินระดับซิงเกิลเพราะไม่สามารถมั่นใจได้ว่าระดับซิงเกิลนอกจากนี้ยังอาจจะใช้งานในพื้นที่อื่น ๆ เพื่อให้เป็นไป โหลดคราวนี้ยกตัวอย่างเช่นที่ไม่เหมาะสมได้อย่างชัดเจน เวลานี้ในลักษณะนี้เมื่อเทียบกับสามชนิดแรกของวิธีที่มันเป็นที่เหมาะสมมาก

ตัวอย่างรหัสสินค้า:

เรียนสาธารณะ Singleton {  
    ส่วนตัว SingletonHolder ระดับคงที่ {  
    ส่วนตัวสุดท้ายคงซิงเกิลใหม่เช่น = โทน ();  
    }  
    ส่วนตัวโทน () {}  
    สาธารณะคงสุดท้ายซิงเกิล getInstance () {  
    กลับ SingletonHolder.INSTANCE;  
    }  
}   

6 ระบุ

รุ่น JDK: jdk1.5 จาก

มีการเริ่มต้นขี้เกียจ: ไม่มี

มีความปลอดภัยด้ายหลาย: ใช่

บรรลุความยาก: ง่าย

คำอธิบาย: การดำเนินการนี้ยังไม่ได้รับการยอมรับอย่างกว้างขวาง แต่นี้เป็นวิธีที่ดีที่สุดที่จะใช้รูปแบบเดี่ยวมันเป็นความรัดกุมมากขึ้นเป็นอันดับกลไกการสนับสนุนโดยอัตโนมัติเพื่อป้องกันไม่ให้เกิดกรณีหลายแน่นอน
วิธีนี้เป็นวิธีที่มีประสิทธิภาพเขียน Java Josh Bloch สนับสนุนวิธีการที่จะไม่เพียง แต่สามารถหลีกเลี่ยงปัญหาการประสานด้ายหลาย แต่ยังสนับสนุนกลไกอัตโนมัติเพื่อป้องกันไม่ให้เป็นอันดับ deserialization ใหม่สร้างวัตถุใหม่อย่างป้องกัน instantiation หลาย อย่างไรก็ตามตั้งแต่เข้าร่วมเฉพาะหลังจากที่คุณสมบัติ enum jdk1.5 เขียนในลักษณะนี้ไม่สามารถช่วย แต่รู้สึกแปลกในทางปฏิบัติที่ไม่ค่อยได้ใช้
โดยไม่ได้รับการโจมตีสะท้อนที่จะเรียกตัวสร้างส่วนตัว

ตัวอย่างรหัสสินค้า:

enum สาธารณะ Singleton {  
    เช่น;  
    โมฆะสาธารณะ whateverMethod () {  
    }  
}  

กฎของหัวแม่มือ: ภายใต้สถานการณ์ปกติไม่แนะนำให้ใช้ชนิดแรกและวิธีขี้เกียจประเภทที่สองก็จะแนะนำให้ใช้วิธีที่สามคนหิวเฉพาะเมื่อคุณต้องการที่จะใช้ผลการโหลดขี้เกียจเป็นที่ชัดเจนเราจะใช้ห้าชนิดแรกของวิธีที่จะลงทะเบียน ถ้ามันมาถึง deserialize วัตถุที่จะสร้างคุณสามารถลองใช้โหมดการแจงนับหก หากคุณมีความต้องการพิเศษอื่น ๆ ที่คุณสามารถพิจารณาใช้ตรวจสอบอีกครั้งที่สี่โหมดล็อค