The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by ปิติ เกตุ, 2021-04-04 04:44:55

Java OOP Programming

Java OOP Programming

345

}
----------------------------------------------------------------------------------------------------------------------
public class Fruit {

public String showName(){
return "Not implemented yet.";

}
public int showPrice(){

return 0;
}
}
----------------------------------------------------------------------------------------------------------------------
public class pineapple extends Fruit{
public String showName(){

return "สัปปะรด.";
}
public int showPrice(){

return 15;
}
}
----------------------------------------------------------------------------------------------------------------------
public class Apple extends Fruit{
public String showName(){

return "แอปเปิ้ ล.";
}
public int showPrice(){

return 20;
}
}
----------------------------------------------------------------------------------------------------------------------
public class Mango extends Fruit{

346

public String showName(){
return "มะม่วง.";

}
public int showPrice(){

return 15;
}
}
----------------------------------------------------------------------------------------------------------------------

หลงั จากน้นั ออกแบบโปรแกรมหลกั ดงั น้ี

ภาพที่ 9.18 แสดงการออกแบบส่วนการติดต่อของตวั อยา่ งท่ี 9.15
----------------------------------------------------------------------------------------------------------------------
ส่วนหัว
import oop.Lesson9.Ex_9_15.Food.*;
import oop.Lesson9.Ex_9_15.Fruit.*;
import oop.Lesson9.Ex_9_15.Water.*;
----------------------------------------------------------------------------------------------------------------------
public class fastFoodShop extends javax.swing.JFrame {

347

fastFood food;
Fruit fruit;
Drinking drinking;
--------------------------------------------------------------------------------------------------------------------
ป่ ุมประมวลผล
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//เลือกอาหาร
if(jRadioButton1.isSelected()){

food =new RiceAndOmelet();
}else
if(jRadioButton2.isSelected()){

food = new Noodle();
}else

if(jRadioButton3.isSelected()){
food = new Spaghetti();

}
//เลือกน้า
if(jRadioButton4.isSelected()){

drinking =new PureWater();
}else
if(jRadioButton5.isSelected()){

drinking = new OrangeJuice();
}else

if(jRadioButton6.isSelected()){
drinking = new CokaCola();

}

//เลือกผลไม้
if(jRadioButton7.isSelected()){

fruit =new pineapple();

348

}else
if(jRadioButton8.isSelected()){

fruit = new Apple();
}else

if(jRadioButton9.isSelected()){
fruit = new Mango();

}
//รายงานผล
jTextField1.setText(food.showName());
jTextField4.setText(String.valueOf(food.showPrice()));
jTextField2.setText(drinking.showName());
jTextField5.setText(String.valueOf(drinking.showPrice()));
jTextField3.setText(fruit.showName());
jTextField6.setText(String.valueOf(fruit.showPrice()));
jTextField7.setText(String.valueOf(food.showPrice()+drinking.showPrice()+fruit.showPrice()));
}
ป่ มุ ปิ ด
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);

}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั ภาพที่ 9.19 และตอบสนองการทางานของป่ ุมต่าง ๆ ตามที่โจทยก์ าหนด

349

ภาพที่ 9.19 แสดงผลการรันของตวั อยา่ งท่ี 9.15
นอกจากการสร้างจากการสื บทอดตามปกติแล้ว สามารถท่ีสร้างพหุสัณฐานจาก
อินเทอร์เฟส หรือ แอบสแทรกคลาสก็ไดเ้ ช่นกนั โดยใชก้ ารอิมพลีเมนต์สาหรับอินเทอร์เฟส และ
สืบทอดคุณสมบตั ิของแอบสแทรกคลาสก็ได้

สรุป

พหุสัณฐาน คือ การท่ีเมธอดหน่ึงทาหน้าหลายอย่าง โดยเรียกใช้งานในตอนรันไทม์
เคร่ืองมือสาหรับสร้างพหุสัณฐานได้แก่ การประกาศตวั แปรแบบพลวตั และการโอเวอร์โหลด
โอเวอร์ไรด์ การเคสติ้งและการดาวน์เคสติ้ง ที่จะแปลงวตั ถุไปมาระหว่างวตั ถุของคลาสแม่และ
คลาสยอ่ ยท่ีสืบทอดมา การสร้างพหุสณั ฐานโดยทวั่ ไปจะใชก้ ารโอเวอร์โหลด การสืบทอดเป็ นหลกั
นอกจากน้นั อินเทอร์เฟส และคลาสแอบสแทรก ก็สามารถทาไดเ้ ช่นกนั

350

แบบฝึ กหัดท้ายบท

1. พหุสัณฐานคืออะไร
2. เคร่ืองมือสาหรับสร้างพหุสัณฐานมีอะไรบา้ ง
3. จงอธิบายและยกตวั อยา่ ง การสร้างประกาศตวั แปรแบบยดึ ติดกบั พลวตั
4. จงเขียนโปรแกรมสร้างการเคสติ้งระหวา่ งคลาสของเล่นและเครื่องเล่นของเด็ก
5. จงเขียนโปรแกรมสร้างเก็บประวตั ิคอมพิวเตอร์จานวนสามหอ้ งโดยใชก้ ารเขียน

โปรแกรมแบบพหุสัณฐานแบบโอเวอร์โหลด
6. จากขอ้ 5 จงออกแบบและเขียนโปรแกรมใหใ้ ชค้ ุณสมบตั ิการสืบทอด
7. จงออกแบบร้านขายหนงั สือโดยใชพ้ หุสณั ฐาน ดว้ ยวธิ ีการโอเวอร์โหลด
8. จากขอ้ 7 จงออกแบบและเขียนโปรแกรมโดยใชพ้ หุสัณฐานแบบการสืบทอด
9. จงออกแบบคลาสไดอะแกรมของร้านขายอุปกรณ์อิเลก็ ทรอนิกส์ไดแ้ ก่ โทรทศั น์ วทิ ยุ

และเครื่องอา่ นซีดี
10. จงออกแบบโปรแกรมโดยใชอ้ ินเทอร์เฟส ของร้านขายอุปกรณ์อิเล็กทรอนิกส์ในขอ้ 9

ใหเ้ ป็นพหุสัณฐาน
11. จงอธิบายความหมายของ Substitutability พร้อมท้งั ยกตวั อยา่ งประกอบ
12. จงอธิบายความหมายของ Extensibility พร้อมท้งั ยกตวั อยา่ งประกอบ
13. จงอธิบายความหมายของการรับทอดและอินเทอร์เฟสที่เก่ียวของกบั ภาวะพหุสัณฐาน
14. จงบอกขอ้ ดีและขอ้ เสียของภาวะพหุสัณฐาน
15. จงบอกวา่ งานอยา่ งไรปัจจุบนั ท่ีสามารประยกุ ตใ์ ชภ้ าวะพหุสัณฐานได้

351

เอกสารอ้างอิง

กิตติ ภกั ดีวฒั นกุล. (2543 ก). JAVA ฉบบั พนื้ ฐาน. กรุงเทพฯ: ไทยเจริญการพมิ พ.์
_________. (2543 ข). JAVA ฉบบั โปรแกรมเมอร์. กรุงเทพฯ: ไทยเจริญการพิมพ.์
กิตติ ภกั ดีวฒั นะกุล และ ศิริวรรณ อมั พรดนยั . (2544). Oject-Oriented ฉบับพนื้ ฐาน. กรุงเทพฯ:

KTP Comp&Consult.
กิตติพงษ์ กลมกล่อม. (2552). การวเิ คราะห์และออกแบบระบบเชิงวตั ถุด้วย UML. กรุเทพฯ: เคทีพี

แอนด์ คอนซลั ท.์
พนิดา พานิชกลุ . (2548). Object-Oriented ฉบบั พนื้ ฐาน. กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
_________. (2554). การเขียนโปรแกรมคอมพิวเตอร์เบื้องต้นด้วยภาษาจาวา. พิมพ์คร้ังท่ี 5.

กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
Bruce Eckel. (2000). Thinking in Java. 2nd . USA: Prentice Hall PTR Prentice-Hall.
Cay Horstmann. (2002). Object-Oriented Design & Patterns. USA: John Wiley & Sons.
David Etheridge. (2009 A). Java:The Fundamentals of Objects and Classes-An Introduction

to Java Programming. Ventus Publishing Aps. [Online]. Available:
http://www.BookBoon.com
_________. (2009 B). Java: Classes in Java Applications An Introduction to Java
ProGramming.
Simol Kendal. (2009). Object Orientted Programming using Java. Ventus Publishing Aps.
[Online]. Available: http://www.BookBoon.com
Wikipedia. (2007). “Object-oriented programming”. [Online] Available:
http://en.wikipedia.org/wiki/Object-oriented_programming.
Y. Daniel Liang. (2007). Introduction to Java Programming. USA: Pearson Prentice Hall
Pearson Education, Inc.

บทท่ี 10

ดไี ซน์แพทเทริ ์นและเฟรมเวริ ์ก

จากความรู้ที่ผา่ นมา การใช้งานคลาสต่างๆ อาจจะอยู่ในรูปแบบของคลาสเด่ียว หรือกลุ่ม
คลาสท่ีมีการสืบทอดคุณสมบตั ิ การสร้างเป็ นอินเทอร์เฟส เพ่ือนาคลาสที่ทาหน้าที่ต่างๆ มา
ประกอบกนั เพ่ือสร้างงานให้ไดต้ ามที่ตอ้ งการ ในบทน้ีจะนาเสนอเน้ือหาที่มีขอบเขตและแนวคิด
กวา้ งมากกวา่ ที่ไดศ้ ึกษาไปแลว้ คือ การสร้างกลุ่มของคลาสที่มีความสัมพนั ธ์กนั ในปริมาณมากข้ึน
และการแกป้ ัญหาในแต่ละเรื่องท่ีอาจเกิดข้ึนในลกั ษณะเดียวกนั ซ่ึงการสร้างกลุ่มคลาสดงั กล่าว
ได้แก่การใช้งานดีไซด์แพทเทิร์น (Design Pattern) และแนวคิดของเฟรมเวิร์ก (Framework)
เบ้ืองตน้

แนวคดิ ของดไี ซด์แพทเทิร์น

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

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

อิริค บรูด (Eric Brude, 2004, p.125) ไดใ้ หค้ วามหมายของดีไซด์แพทเทิร์นไวว้ า่ เป็ นการ
รวมคลาสและการประกอบอลั กอริทึม ซ่ึงเป็ นส่วนเติมเตม็ ของการออกแบบตามวตั ถุประสงคท์ ่ีต้งั
เอาไวโ้ ดยทว่ั ไป ซ่ึงส่วนของการออกแบบจะเนน้ ส่วนของแนวคิดมากกวา่ การกาหนดการรวมเป็ น
หลกั และการ ประกอบกนั ของอลั กอริทึมเนน้ ของส่วนการดาเนินการแบบพ้นื ฐาน

ดงั น้นั ดีไซด์แพทเทิร์นจึงหมายถึงกลุ่มของคลาสที่ทาหนา้ ที่ในการแกป้ ัญหาเรื่องใดเร่ือง
หน่ึงโดยเฉพาะ โดยการเชื่อมโยงกนั ภายในคลาสน้นั จะเน้นเร่ืองการนาไปใชง้ านเป็ นหลกั ซ่ึงจะ
รวมเอาวิธีการแกป้ ัญหาโดยใช้แนวคิดการดาเนินการและใช้คาส่ังพ้ืนฐาน เพื่อช่วยให้ผูท้ ่ีพฒั นา

353

โปรแกรมไดใ้ ชง้ านอยา่ งรวดเร็วและมีประสิทธิภาพท้งั ในเชิงการสร้างวตั ถุและการยืดหยุน่ การนา
กลบั มาใชใ้ หม่และการปรับปรุงดูแลรักษา

ประเภทของดีไซด์แพทเทิร์นน้นั แก็งออฟโฟ (Gang of Four (GoF)) และ อิริค บรูด (Eric
Brude , 2004) แบง่ ออกเป็น 3 กลุ่ม คือ

1. ครีเอชนั ดีไซดแ์ พทเทิร์น (Creation Design Pattern) ประเภทน้ี แกป้ ัญหาการสร้าง
วตั ถุที่มีความซบั ซอ้ น

2. สตรักเจอรัลดีไซด์แพทเทิร์น (Structural Design Pattern) แกป้ ัญหาดา้ นการสร้าง
โครงสร้างท่ีมีความซ้าซอ้ นกนั

3. บีเฮบวิเออร์ดีไซด์แพทเทิร์น (Behavior Design Pattern) แก้ไขปัญหาที่เกิดจาก
พฤติกรรมที่แตกตา่ งกนั

การสร้างดีไซด์แพทเทิร์นโดยทว่ั ไปจะนาเอาแนวคิดโพลีมอฟิ ซึมมาใชง้ านอยา่ งเตม็ ที่ โดย
จะสร้างการสืบทอดในลกั ษณะต่างกนั แลว้ สร้างส่วนของการเรียกใชด้ ว้ ยความสัมพนั ธ์แบบที่ได้
ศึกษาไปแลว้ ไดแ้ ก่ความสัมพนั ธ์แบบคอมโพสซิสชนั Aggregation, Composition เป็ นตน้ ให้
สังเกตจากตวั อยา่ งน้ี

ภาพท่ี 10.1 แสดงคลาสไดอะแกรมของรถยนตด์ ว้ ยโพลีมอฟิ ซึม

ตวั อย่างน้ีเป็ นการเขียนโปรแกรมแบบเดิมที่ไม่มีประสิทธิภาพและยงั ไม่ใช้แนวทางของ
การออกแบบท่ีเป็ นดีไซด์แพทเทิร์น ซ่ึงหากเขียนโปรแกรมจะไดล้ กั ษณะของโคด้ ส่วน CarClient
ใน main() ดงั น้ี

354

public static void main(String args[]) {
Toyota t=new Toyota();
Honda d=new Honda();
Ford f=new Ford();
….
case 1:{ t.drive(); …
case 2: { d.drive(); …
case 3: {f.drive(); …


}
การสร้างวตั ถุแบบน้ีจะทาใหเ้ กิดการสร้างวตั ถุข้ึนมาโดยไม่จาเป็ น โดยการสร้างวตั ถุของส่วนของ
การสืบทอดทุกคลาสจึงจะทาใหโ้ ปรแกรมทางานไดอ้ ยา่ งเหมาะสม วธิ ีการแกป้ ัญหาการสร้างวตั ถุที่
มีความซ้าซอ้ นและการสร้างข้ึนมาเป็นจานวนมากน้ีอาจแกไ้ ดด้ ว้ ยการสร้างคลาสใหม่ดงั น้ี

ภาพที่ 10.2 แสดงคลาสไดอะแกรมของรถยนตห์ ลงั การปรับปรุง

ส่วนของคลาสที่สืบทอดมาเขียนดงั น้ี
class Toyota{

public void drive()…
public Car createCar(){

return new Toyota();

355

}
}
…//คลาส Honda และ Ford ก็เขียนในลกั ษณะเดียวกนั

ส่วนของโปรแกรมหลกั กจ็ ะไดด้ งั น้ี
public static void main(String args[]) {

Car c;
….
case 1:{ Toyota t=new Toyota(); c=t.createCar();…
case 2: { Honda d=new Honda(); c=d.createCar(); …
case 3: { Ford f=new Ford(); c=f.createCar(); …

c.drive();
}
การเขียนโปรแกรมในลกั ษณะน้ีนาเอาแนวคิดของการสร้างดีไซดแ์ พทเทิร์นมาใช้ โดย
แนวคิดน้ีจะช่วยในการแกไ้ ขปัญหาการสร้างวตั ถุใหน้ อ้ ยลง เป็ นตน้

ครีเอชันดไี ซด์แพทเทริ ์น

ครีเอชนั ดีไซน์แพทเทิร์น เป็ นดีไซน์แพทเทิร์นท่ีสร้างข้ึนมาเพ่ือแก้ปัญหาการสร้างวตั ถุ
จานวนมากโดยไมจ่ าเป็นโดยเฉพาะอยา่ งยงิ่ ในตอนรันไทมแ์ ลว้ มีการเลือกหรือการใชง้ านเพียงวตั ถุ
ท่ีจาเป็นเท่าน้นั ไม่ไดม้ ีการใชง้ านท้งั หมด หากไม่ใชด้ ีไซน์แบบน้ีเขา้ ช่วยจะทาให้เกิดการสร้างวตั ถุ
ที่มีปริมาณมาก ๆ โดยไม่จาเป็ น ดีไซน์แพทเทิร์นกลุ่มไดแ้ ก่ แฟคทอรีดีไซน์แพทเทิร์น (Factory
Design Pattern) ซิงเกิลตนั ดีไซน์แพทเทิร์น (Singleton Design Pattern) แอบสแทรกแฟกทอรีดีไซน์
แพทเทิร์น (Abstract Factory Desing Pattern) โปรโตไทป์ ดีไซน์แพทเทิร์น (Prototype Design
Pattern) เป็ นตน้ การนาเสนอต่อไปน้ีจะแสดงตวั อย่างเพียงบางชนิดของดีไซด์แพทเทิร์นแบบน้ี
เท่าน้นั

แฟคทอรีดีไซน์แพทเทริ ์น

วตั ถุประสงค์ ของดีไซน์แพทเทิร์นแบบน้ีสร้างวตั ถุเดี่ยวในสถานการท่ีคอนสตรักเตอร์ท่ี
ใชใ้ นการสร้างวตั ถุท่ีตอ้ งการไม่สามารถจดั การปัญหาได้ โดยท่ีใชเ้ มธอดสาหรับคืนค่าเป็ นวตั ถุท่ี
ตอ้ งการ ตวั อยา่ ง เช่น

356

จากภาพที่ 10.1 พบวา่ หากสร้างวตั ถุจาก คอนสตรักเตอร์ของคลาส Car c=new Car(); จะ
พบวา่ ไม่สามารถสร้างทางเลือกใหก้ บั การสร้างวตั ถุอื่น ๆ ที่สืบทอดมาได้ เช่น ไม่สามารถเลือกวตั ถุ
ของ Toyota Honda หรือ Ford ได้ ซ่ึงทาให้เกิดการสร้างวตั ถุท้งั หมดข้ึนมาจึงจะสามารถเลือกได้
ดงั น้นั ดีไซนแ์ พทเทิร์นแบบน้ีจึงมีวธิ ีการและแนวคิดดงั น้ี

ภาพท่ี 10.3 แสดงคลาสไดอะแกรมของแนวคิดของแฟคทอรีดีไซด์แพทเทิร์น
การออกแบบและพฒั นาดีไซน์แพทเทิร์นสาหรับใช้งานน้ันมีแนวคิดดังภาพด้านบนน้ี
กล่าวคือ มีส่วนของ แฟคทอรีดีไซน์ที่บรรจุกลุ่มของคลาสที่ตอ้ งการใชง้ านจานวนมาก ๆ และสืบ
ทอดกนั จานวนมากก็ได้ แต่ภายในน้นั จะบรรจุเมธอดสาหรับการสร้างวตั ถุที่ตอ้ งการเลือกทางาน
เท่าที่ตอ้ งการ เช่น ในภาพจะพบวา่ มีคลาส RequiredClass เป็ นคลาสท่ีตอ้ งการดงั น้นั ภายในส่วน
ของแฟคทอรีจะมีเมธอด createObjectRequiredClass() สาหรับสร้างคลาสท่ีตอ้ งการโดยชนิดของ
การคืนค่า จะเป็ น RequiredClass เป็ นตน้ ส่วน Client เป็ นคลาสท่ีใชส้ าหรับเรียกใชง้ าน ซ่ึงจะมี
ส่วนของโปรแกรมหลกั สาหรับเรียกกลุ่มของแฟคทอรีทางาน ตวั อยา่ งดงั กลุ่มของคลาส Car ดงั ท่ี
เสนอไปแลว้ ซ่ึงหากนามาเขียนในรูปแบบของแฟคทอรีดีไซน์แพทเทิร์นแบบน้ีจะไดด้ งั ภาพ

357

ภาพที่ 10.4 แสดงคลาสไดอะแกรมของแนวคิดของแฟคทอรีดีไซด์แพทเทิร์นของรถยนต์
ตวั อยา่ งการเขียนโปรแกรมแสดงดงั ตวั อยา่ งท่ี 10.1

ตัวอย่างที่ 10.1 จากภาพที่ 10.3 จงเขียนโปรแกรมให้ผใู้ ชเ้ ลือกรถยนตท์ ี่ตอ้ งการขบั แลว้ เรียกใช้
เมธอด drive() สาหรับทางานโดยการสร้างวตั ถุที่จาเป็นเท่าน้นั
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_1.FactoryOfCarApplication;
public class Car {
public Car crateCar(){

return new Car();
}
public void drive(){

System.out.println("Car need to implement.");
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_1.FactoryOfCarApplication;

358

public class Toyota extends Car{
public Car crateCar() {
return new Toyota();
}
public void drive() {
System.out.println("I am Toyota, and I am running.");
}

}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_1.FactoryOfCarApplication;
public class Honda extends Car{

public Car crateCar() {
return new Honda();

}
public void drive() {
System.out.println("I am Honda, and I am running.");
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_1.FactoryOfCarApplication;
public class Ford extends Car{
public Car crateCar() {

return new Ford();
}
public void drive() {
System.out.println("I am Ford, and I am running.");
}
}
----------------------------------------------------------------------------------------------------------------------

359

package oop.Lesson10.Ex_10_1;
import java.io.*;
import oop.Lesson10.Ex_10_1.FactoryOfCarApplication.*;
public class Client {
public static void main(String args[]) throws IOException{

Car c=null;
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader stdin = new BufferedReader(reader);
System.out.println("Input Choice:1-3:");
String input=stdin.readLine();
switch(Integer.parseInt(input)){
case 1:{

Toyota t=new Toyota();
c=t.crateCar(); break;
}
case 2: {
Honda t=new Honda();
c=t.crateCar(); break;
}
case 3: {
Ford t=new Ford();
c=t.crateCar(); break;
}
default:break;
}
c.drive();
}
}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี

360

Input Choice:1-3: 2
I am Honda, and I am running.

แอบสแทรกแฟคทอรีดีไซน์แพทเทริ ์น

แอบสแทรกแฟคทอรีดีไซน์แพทเทิร์น (Abstract Factory Design Pattern) มีวตั ถุประสงค์
เพ่อื สร้างส่วนอินเทอร์เฟสสาหรับสร้างชุดหรือกลุ่มของวตั ถุท่ีไม่จาเพาะเจาะจงลงไปแน่นอนวา่ จะ
ใชค้ ลาสใดชดั เจน ซ่ึงผลของการสร้างโดยใชด้ ีไซน์แพทเทิร์นน้ีจะทาใหส้ ามารถสร้างชุดของวตั ถุ
ของคลาสท่ีใช้งานไดต้ ามที่ตอ้ งการในตอนรันโปรแกรมได้ เช่น หากได้รับการสร้างโปรแกรม
สาหรับตกแตง่ หอ้ งนอน ซ่ึงมีรูปแบบหลาย ๆ รูปแบบท้งั ฝาผนงั พ้นื ห้อง ผา้ ม่าน และอื่น ๆ อีก ต่าง
มีหลากหลายรูปแบบ ซ่ึงการเขียนโปรแกรมจะต้องให้ผูใ้ ช้เลือกรูปแบบตามใจ หลังจากน้ัน
โปรแกรมจึงประมวลผลเพื่อสร้างวตั ถุจริงสาหรับใช้งานในตอนหลังจากผูใ้ ช้เลือก เป็ นต้น
โครงสร้างเชิงแนวคิดของดีไซน์แบบน้ีเป็นดงั น้ี

ภาพที่ 10.5 แสดงคลาสไดอะแกรมแบบแอบสแทรกแฟคทอรีดีไซดแ์ พทเทิร์น
(แนวคิดจาก Eric Braude, 2004, p.159)

จากภาพอธิบายไดว้ า่ กลุ่มของคลาสภายในแอบสแทรกแฟคทอรีจะประกอบดว้ ย
1. กลุ่มของรูปแบบคลาส ไดแ้ ก่ StyleAFactory, StyleBFactory, และรูปแบบอ่ืน ๆ ตามที่
ต้องการ ซ่ึงในท่ีน้ีจะรวมถึงความสัมพันธ์ของคลาสท่ีเก่ียวข้องของแต่ละรูปแบบด้วย เช่น
StyleAFactory อาจมีคลาสท่ีสืบทอด หรือคลาสท่ีมีความสัมพนั ธ์แบบ แอคกรีเกชนั หรือ ดีเพนเดน

361

ก็ได้ เป็ นตน้ โดยกลุ่มคลาสเหล่าน้ีจะใชส้ าหรับกาหนดรูปแบบท่ีจะใชง้ านจริง โดยแต่ละรูปแบบ
จะแตกต่างกนั ไปตามงานท่ีตอ้ งการ

2. คลาส AbstractFactory คลาสน้ีใชส้ าหรับสร้างรูปแบบให้ไดต้ ามที่ตอ้ งการ อาจกล่าว
ไดว้ า่ เป็นคลาสที่ใชใ้ นการจดั เตรียมเพอื่ การสร้างวตั ถุกไ็ ด้

3. คลาส Ensemble เป็ นคลาสที่รวมคลาสและสร้างรูปแบบที่จะใช้งานจริงรวมถึงการ
เรียกใช้งานเมธอดสาหรับ การกาหนดรูปแบบตามท่ีผูใ้ ช้เลือก (setAbstractFactory()) และสั่งให้
ทางานตามท่ีตอ้ งการโดยเรียกใชเ้ มธอด doWork() สาหรับทางาน เป็นตน้

4. ส่วนของโปรแกรมหลกั ท่ีเรียกใชง้ านคือ Client ซ่ึงมีส่วนของเมธอด main เพื่อเรียกให้
ทางาน
ตวั อย่างที่ 10.2 จงออกแบบโปรแกรมเวริ ์ดโปรเซสเซอร์อยา่ งง่าย โดยกาหนดใหม้ ีรูปแบบของ
ตวั อกั ษรสามรูปแบบคือ เล็ก กลาง และใหญ่ ใหอ้ อกแบบพร้อมเขียนโปรแกรมอยา่ งง่าย โดยใช้
ดีไซน์แพทเทิร์นแบบแอบสแทรกแฟคทอรี
คลาสไดอะแกรม

ภาพท่ี 10.6 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 10.2

362

โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_2.WordProcessorFactory;
public class Document {

private Style docStyle;
public void setStyle(Style curStyle){

docStyle=curStyle;
}
public void display(String doc){

System.out.println("The style is "+docStyle.getStyle());
System.out.println("Document :"+doc);
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_2.WordProcessorFactory;
public class Style {
String style;
public void setStyle(String st){
style=st;
}
public String getStyle(){
return style;
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_2.WordProcessorFactory;
public class SmallStyle extends Style{
public String getStyle() {
return style;
}

363

public void setStyle(String st) {
style=st;

}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_2.WordProcessorFactory;
public class MediumStyle extends Style{

public String getStyle() {
return style;

}
public void setStyle(String st) {

style =st;
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_2.WordProcessorFactory;
public class LargeStyle extends Style{
public String getStyle() {

return style;
}
public void setStyle(String st) {

style = st;
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_2;
import java.io.*;
import oop.Lesson10.Ex_10_2.WordProcessorFactory.*;
public class Client {
public static void main(String args[]) throws IOException{

364

Style s=null;
Document doc=new Document();
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader stdin = new BufferedReader(reader);
System.out.println("Input Doc:");
String message=stdin.readLine();
System.out.println("Input Style 1=small, 2=medium, and 3=large:");
String style=stdin.readLine();
switch(Integer.parseInt(style)){
case 1:{

s=new SmallStyle();
s.setStyle("Small Style");
break;
}
case 2: {
s=new MediumStyle();
s.setStyle("Medium Style");
break;
}
case 3: {
s=new LargeStyle();
s.setStyle("Large Style");
break;
}
default:break;
}
doc.setStyle(s);
doc.display(message);
}
}

365

----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
Input Doc: This is the simple word processor, and it is implemented by Abstract Factory Design
Pattern.
Input Style 1=small, 2=medium, and 3=large:2
The style is Medium Style
Document :This is the simple word processor, and it is implemented by Abstract Factory Design
Pattern.

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

ดีไซน์แพทเทิร์นชนิดน้ียงั มีอีกหลากหลายประเภท ซ่ึงแกป้ ัญหาการสร้างวตั ถุในรูปแบบ
แตกต่างกนั และมีโครงสร้าง วธิ ีการเขียนโปรแกรมท่ีแตกตา่ งกนั ไป

สตรักเจอรัลดไี ซน์แพทเทิร์น

ดีไซน์แพทเทิร์นแบบน้ีออกแบบมาเพื่อแก้ปัญหาเร่ืองโครงสร้างของวตั ถุในแง่ของ
ความสัมพนั ธ์แบบ Aggregation เนื่องจากการสร้างวตั ถุที่เป็ นเชิงโครงสร้างน้ีอาจทาให้การเขียน
โปรแกรมเพ่ือสร้างวตั ถุน้ันทาได้ลาบาก เช่น โครงสร้างองค์กร โครงสร้างของโมเลกุล หรือ
แผนงานของหน่วยงาน เป็ นตน้ ซ่ึงการสร้างวตั ถุน้นั จะตอ้ งมีระบบระเบียบ และสามารถจดั การได้
ในรูปแบบท่ีเป็นพลวตั ตวั อยา่ งของดีไซน์แพทเทิร์นกลุ่มน้ีไดแ้ ก่ Façade, Decorator, Composite,
Adapter, Proxy เป็นตน้ การนาเสนอตวั อยา่ งแพทเทิร์นกลุ่มน้ีจะนาเสนอเพียง 2 ประเภทคือ Façade
และ Adapter

ฟัสซาด ดไี ซน์แพทเทริ ์น (Façade Design Pattern)

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

366

ภาพที่ 10.7 แสดงคลาสไดอะแกรมของฟัสซาดดีไซนแ์ พทเทิร์น
แนวคิดคือส่วนของดีไซน์แพทเทิร์นน้ีจะเตรียมอินเทอร์เฟสให้เขา้ ถึงได้ ในส่วนของ
exposed ดงั ภาพเท่าน้นั ส่วนโปรแกรมหลกั จะเรียกใชง้ านไดใ้ นส่วนที่เปิ ดใหใ้ ชง้ าน โดยที่ภายใน
ของการออกแบบในส่วนที่ไม่เปิ ดเผยจะไม่สามารถอา้ งถึงได้ เช่น กรณีในรูปดา้ นบนน้ี Façade
exposed จะสามารถเขา้ ถึงไดแ้ ต่ส่วนของ A ซ่ึงไม่เปิ ดเผยจึงไม่สามารถใชง้ านไดเ้ ป็ นตน้ ตวั อยา่ ง
การออกแบบ เช่น หากตอ้ งการเขียนโปรแกรมเก่ียวกบั การสร้างโปรแกรมเกม ซ่ึงแบ่งแพคเกจ
ออกเป็ น รูปร่างของตวั ละคร สภาวะแวดลอ้ มของเกม และรูปแบบของเกมเอนจินว่าเป็ นแบบใด
สามารถเขียนส่วนออกแบบเบ้ืองตน้ ไดด้ งั น้ี

ภาพที่ 10.8 แสดงคลาสไดอะแกรมฟัสซาดดีไซนแ์ พทเทิร์นของเกม

367

จากภาพอธิบายได้ว่า แต่ละแพคเกจดงั กล่าวเป็ น Façade Design Pattern ท้งั หมด
เน่ืองจากวา่ สร้างส่วนการติดต่อเอาไวใ้ ห้ผทู้ ี่จะใชง้ านไดเ้ ขา้ ถึงเฉพาะเท่าน้นั โดยส่วน Client จะ
เขา้ ถึงไดเ้ พียงแค่ FaçadeGame ท่ีมีเมธอดเท่าที่สามารถทาไดเ้ ท่าน้นั ในขณะที่ แต่ละแพคเกจของ
เกมดังกล่าวน้ัน สามารถท่ีจะเข้าถึงได้เฉพาะอินเทอร์เฟสท่ีต้องการเท่าน้ัน ซ่ึงในการนาไป
ประยกุ ตใ์ ชง้ านจริงน้นั ในแต่ละแพคเกจอาจมีจานวนของอินเทอร์เฟสและคลาสที่เก่ียวขอ้ งกนั อยา่ ง
มากมายก็ได้ สาหรับการพฒั นาโปรแกรมตวั อยา่ งใหพ้ จิ ารณาจากตวั อยา่ งที่ 10.3

ตวั อย่างที่ 10.3 จากการออกแบบเกมจงเขียนโปรแกรมเพ่อื สร้างส่วนของเกม โดยมีตวั ละคร แลว้
กาหนดคุณลกั ษณะ สภาวะแวดลอ้ ม และเลือกเกมเอนจินที่จะทางาน โดยการเขียนโปรแกรมจาก
ไดอะแกรมของภาพท่ี 10.8
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3.GameCharacter;
public interface myGameCharacter {

public void setCharacter(String c);
public String getCharacter();
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3.GameEngine;
import oop.Lesson10.Ex_10_3.GameCharacter.*;
public interface myGameEngine {
public void setEngine(String eg);
public String getEngine();
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3.GameEnvironment;
public interface myGameEnvironment {
public void setEnvironment(String e);
public String getEnvironment();
}

368

----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3.GameAppFacade;
import oop.Lesson10.Ex_10_3.GameCharacter.*;
public class implCharacter implements myGameCharacter{

String mycharacter;
public String getCharacter() {

return mycharacter;
}
public void setCharacter(String c) {

mycharacter=c;
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3.GameAppFacade;
import oop.Lesson10.Ex_10_3.GameEngine.*;
public class implEngine implements myGameEngine{
String myEngine;
public String getEngine() {

return myEngine;
}
public void setEngine(String eg) {

myEngine=eg;
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3.GameAppFacade;
import oop.Lesson10.Ex_10_3.GameEnvironment.*;
public class implEnvironment implements myGameEnvironment{
String myEnvironment;

369

public String getEnvironment() {
return myEnvironment;
}
public void setEnvironment(String e) {
myEnvironment=e;
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3.GameAppFacade;
public class FacadeGame {
private implCharacter c=new implCharacter();
private implEnvironment e=new implEnvironment();
private implEngine eg=new implEngine();
public String processCharacter(String character){
this.c.setCharacter(character);
return this.c.getCharacter();
}
public String processEngine(String engine){
this.eg.setEngine(engine);
return this.eg.getEngine();
}
public String processEnvironment(String environment){
this.e.setEnvironment(environment);
return this.e.getEnvironment();
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_3;
import java.io.*;
import oop.Lesson10.Ex_10_3.GameAppFacade.*;

370

public class Client {
public static void main(String args[]) throws IOException{

String myActor;
String actorCharacter;
String gameEngine;
String gameEnvironment;

FacadeGame game=new FacadeGame();
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader stdin = new BufferedReader(reader);
System.out.println("Input Actor Game:");
myActor=stdin.readLine();
System.out.println("Input Actor Character :");
actorCharacter=stdin.readLine();
System.out.println("Input Game Environment:");
gameEnvironment=stdin.readLine();
System.out.println("Input Game Engine :");
gameEngine=stdin.readLine();
//Show Activities
System.out.println("The actor:"+myActor);
System.out.println("Character:"+game.processCharacter(actorCharacter));
System.out.println("Environment:"+game.processEnvironment(gameEnvironment));
System.out.println("Engine:"+game.processEngine(gameEngine));
}
}
----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
Input Actor Game:Evil
Input Actor Character :Running
Input Game Environment:Forest
Input Game Engine :Client and Server

371

The actor:Evil
Character:Running
Environment:Forest
Engine:Client and Server

อะแดปเตอร์ดไี ซน์แพทเทิร์น (Adapter Design Pattern)

ดีไซน์แพทเทิร์นแบบน้ี มีวตั ถุประสงค์เพื่อสร้างส่วนการติดต่อเพื่อให้โปรแกรมเรียกใช้
ฟังก์ชนั ภายนอกที่สร้างดว้ ยระบบใหม่ที่มีการเปลี่ยนแปลงโดยไม่กระทบกระเทือนต่อการทางาน
ภายใน ซ่ึงแกป้ ัญหาสาหรับการท่ีตอ้ งมีการเปล่ียนแปลงระบบเก่าไปเป็ นระบบใหม่ หรือการสร้าง
ส่วนการติดตอ่ ที่มีการเปลี่ยนแปลงใหม่เปรียบเสมือนการสร้างอะแดปเตอร์เพ่ือแปลงระบบใหม่ให้
สามารถเข้าใช้งานกบั ระบบท่ีมีอยู่ ในชีวิตประจาวนั เช่น การมีแท่นชาร์ตไฟโทรศพั ท์มือถือ
สามารถเสียบไดก้ บั ไฟฟ้ ากระแสตรง และกระแสไฟฟ้ าไดด้ ้วยการเสียบเตา้ ปลกั๊ แบบเดิม ซ่ึงจะ
พบว่าตวั ต่อเขา้ โทรศพั ท์จะเหมือนเดิมทุกอยา่ ง เสียบเขา้ ท่ีเดิม แต่ส่วนของการชาร์ตไฟประจุจะ
สามารถปรับตวั ให้เขา้ ได้กับไฟฟ้ าท้งั สองกระแส เป็ นต้น แนวคิดและโครงสร้างของคลาส
ไดอะแกรมเป็นดงั น้ี

ภาพท่ี 10.9 แสดงคลาสไดอะแกรมของอะแดปเตอร์ดีไซน์แพทเทิร์น

372

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

ภาพที่ 10.10 แสดงคลาสไดอะแกรมแบบอะแดปเตอร์ดีไซน์แพทเทิร์นของการคานวณภาษี

จากภาพดงั กล่าวน้ีแยกออกเป็ น 3 แพคเกจ ซ่ึงแพคเกจ LegacyAccount อาจนาเอาแพคเกจ
ใหม่ ๆ หรือการคานวณอื่น ๆ เขา้ มาเปลี่ยนแปลงในอนาคตได้ สาหรับการนามาเขียนโปรแกรมเพื่อ
ใชง้ าน ดงั ตวั อยา่ งท่ี 10.4

ตวั อย่างท่ี 10.4 จากระบบบญั ชีเก่าดงั กล่าว จงเขียนโปรแกรมเพอื่ นาเสนอการใชง้ านอยา่ งง่าย
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_4.LegacyAccount;
public class TaxCalculate {

public double compute(double money){
return money*0.07;

}
}
----------------------------------------------------------------------------------------------------------------------

373

package oop.Lesson10.Ex_10_4.AdapterPackage;
import oop.Lesson10.Ex_10_4.LegacyAccount.*;
import oop.Lesson10.Ex_10_4.Application.*;
public class Adapter extends AbstractApplication{

TaxCalculate taxobj=new TaxCalculate();
public double processMethod(double m){

return taxobj.compute(m);
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_4.Application;
public abstract class AbstractApplication {
abstract public double processMethod(double m);
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_4.Application;
import java.io.*;
import oop.Lesson10.Ex_10_4.AdapterPackage.*;
public class Client {
public static void main(String args[]) throws IOException{

String money;
AbstractApplication adapter=new Adapter();
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader stdin = new BufferedReader(reader);
System.out.println("Input Money:");
money=stdin.readLine();
double taxResult=adapter.processMethod(Double.parseDouble(money));
System.out.format("Tax is :%.2f",taxResult);
}
}

374

----------------------------------------------------------------------------------------------------------------------
ผลการรัน แสดงดงั น้ี
Input Money: 300000
Tax is : 21000.00

ดีไซน์แพทเทิร์นชนิดน้ียงั มีอีกหลายแบบท่ีแกป้ ัญหาเก่ียวกบั โครงสร้างของวตั ถุท่ีแตกต่าง
กนั ดงั ที่กล่าวไปแลว้ ซ่ึงการนาไปใชค้ วรจะมีการปรับให้เขา้ กบั งานและศึกษาการใช้งานเพ่ิมเติม
จากแหล่งความรู้อื่น ๆ อีก

บเี ฮฟวเิ ออร์ดไี ซน์แพทเทิร์น

ดีไซน์แพทเทิร์นกลุ่มน้ีใช้สาหรับจัดการกบั พฤติกรรมของวตั ถุท่ีมีการมีพฤติกรรมที่
แตกต่างกนั หลายพฤติกรรมระหวา่ งท่ีรันอยู่ ดีไซน์กลุ่มน้ีจะจดั การเรื่องการนากลบั มาใช้ใหม่และ
การจดั การเรื่องการเขียนจะเป็ นการง่าย แพทเทิร์นกลุ่มน้ีไดแ้ ก่ Interpreter ใชส้ าหรับการแกป้ ัญหา
การจดั การเก่ียวกบั การเป็ นตวั แปลภาษา, Iterator ใชส้ าหรับพฤติกรรมของการจดั การกบั อิลิเมนต์
ของวตั ถุต่าง ๆ ตามลาดบั โดยไม่ตอ้ งจดั การภายในที่ยุ่งยาก, Mediator ใช้สาหรับหลีกเลี่ยงการ
อา้ งอิงระหวา่ งความสัมพนั ธ์ของวตั ถุแบบอิสระ (Dependence), และ Observer ใชส้ าหรับจดั การ
สาหรับการจดั การเพียงวตั ถุเดียวแลว้ ทาให้พฤติกรรมของวตั ถุท่ีเก่ียวขอ้ งถูกเปล่ียนแปลง ไปดว้ ย
เป็ นตน้

อทิ เทอเรเตอร์ดไี ซน์แพทเทริ ์น (Iterator Design Pattern)

ดีไซน์แพทเทิร์นน้ีใชส้ าหรับการเขา้ ถึงอิลิเมนตท์ ่ีมีความสัมพนั ธ์กนั แบบ Aggregation ของ
วตั ถุตามลาดบั โดยไมต่ อ้ งเขา้ ใจในรายละเอียดท่ียงุ่ ยาก แนวคิดของคลาสไดอะแกรมไดด้ งั ภาพที่
10.11

แนวคิดน้ีจะสร้างส่วนของการเป็ นคลาส Iteration แลว้ มีการ เขียนรหัสโปรแกรมเพื่อ
ทางานดงั ConcreteIterator ซ่ึงมีความสัมพนั ธ์กบั ส่วนของวตั ถุของ AggreateElement ที่สร้างจาก
วตั ถุของคลาส ConcreteAggregate ซ่ึงอาจมีความสัมพนั ธ์แบบ 1..n โดยท่ีส่วนของคลาส ได้ โดยที่
การเรียกใชง้ านจะเขา้ ถึงส่วนต่าง ๆ ตามลาดบั เป็ นตน้ ตวั อยา่ งของการใชง้ านดีไซน์แพทเทิร์นกลุ่ม
น้ีได้แก่ โครงสร้างของมูลของจาวาพ้ืนฐาน เช่น java.util.Vector, java.util.ArrayList เป็ นตน้
ตวั อยา่ งของการใชง้ านอยา่ งง่ายของดีไซนแ์ พทเทิร์นน้ีศึกษาไดจ้ ากตวั อยา่ งท่ี 10.5

375

ภาพท่ี 10.11 แสดงคลาสไดอะแกรมของอิทเทอเรเตอร์ดีไซนแ์ พทเทิร์น
ตัวอย่างที่ 10.5 จงเขียนโปรแกรมยก การใช้งานดีไซน์แพทเทิร์นแบบอิทเทอเรเตอร์ โดย
ยกตัวอย่างการเก็บข้อมูลของคนเฉพาะ ชื่อ สกุล โดยท่ีมีเมธอดสาหรับ การสร้างวัตถุใน
คอนสตรักเตอร์ ในการสร้างรายละเอียดของคน หลงั จากน้นั ใช้ java.util.Iterator ในการจดั การ
ขอ้ มูลตวั อยา่ ง
คลาสไดอะแกรม :

ภาพที่ 10.12 แสดงคลาสไดอะแกรมของตวั อยา่ งที่ 10.5

376

โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_5.IteratorApp;
public class Person {

private String Name="";
private String Surname="";
public Person(String n,String s){

this.Name=n;
this.Surname=s;
}
public String getData(){
return ("Name:"+Name+" Surname:"+Surname);
}
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_5.IteratorApp;
public class CollectionPerson extends java.util.Vector{
}
----------------------------------------------------------------------------------------------------------------------
package oop.Lesson10.Ex_10_5;
import oop.Lesson10.Ex_10_5.IteratorApp.*;
public class Client {
public static void main(String args[]){
CollectionPerson cp = new CollectionPerson();
cp.add(new Person("สมพร","ใจดี"));
cp.add(new Person("มะขาว","หวานเจ๊ียบ"));
cp.add(new Person("ทองขาว","ทุง่ ดินดา"));
cp.add(new Person("มะเขือ","อรุณรุ่ง"));
cp.add(new Person("บา่ วว"ี ,"แสนดงั "));
java.util.Iterator iterator= cp.listIterator();

377

while(iterator.hasNext()){
Person temp=(Person)iterator.next();
System.out.println(temp.getData());

}
}
}

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

เฟรมเวริ ์ก (Framework)

เคย์ ฮอร์สแมนน์ (2002, p.322) กล่าวว่า เฟรมเวิร์ก คือ เซตของกลุ่มคลาสท่ีมีการ
ดาเนินการร่วมกนั เพอ่ื เป็นกลไกในการจดั การปัญหาในโดเมนหน่ึง ๆ โดยผเู้ ขียนโปรแกรมสามารถ
สร้างฟังกช์ นั ใหม่โดยการสืบทอดคุณสมบตั ิจากเฟรมเวริ ์กน้นั ๆ

กิตติ ภกั ดีวฒั นกุล และศิริวรรณ อมั พรดนยั (2544, หน้า 141) อธิบายวา่ เฟรมเวริ ์กเป็ น
แนวคิดหน่ึงของการนากลบั มาใชใ้ หม่ ซ่ึงเป็ นการแสดงถึงความเป็ นมาตรฐานของรูปแบบท่ีทาให้
ซอฟตแ์ วร์ตา่ ง ๆ มีรูปแบบที่เป็นแนวทางเดียวกนั

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

เฟรมเวิร์กโดยทวั่ ไปจะออกแบบให้มีความง่ายและสะดวกในการเรียนรู้ และสามารถนา
ความสามารถในการใช้งานต่าง ๆ มาประกอบเขา้ ดว้ ยกนั ภายใตส้ ภาวะแวดลอ้ มเดียวกนั ได้ การ
พฒั นาเฟรมเวิร์กน้นั ผพู้ ฒั นาตอ้ งทราบล่วงหนา้ เก่ียวกบั รูปแบบของอินเทอร์เฟส (Interface) ท่ีจะ
สร้างโปรแกรมหน่ึง ๆ ข้ึนมา เน่ืองจากรูปแบบที่สร้างข้ึนมาใหม่น้ีจะเป็ นไปตามมาตรฐานสอง
ประการของเฟรมเวริ ์กคือ

378

1. ผใู้ ช้งานท่ีโปรแกรมโดยตรง (End user) ซ่ึงไม่จาเป็ นตอ้ งเรียนรู้วิธีการใชง้ านใหม่
เน่ืองจากการทางานหรือการใชง้ านโปรแกรมหากตอ้ งมีการเรียนรู้สิ่งใหม่ ๆ ดว้ ยจะทาใหเ้ สียเวลา
โดยไม่จาเป็ น

2. ผูพ้ ฒั นาโปรแกรมสามารถใช้รหัสตน้ ฉบบั ท่ีเขียนไวแ้ ล้ว โดยไม่จาเป็ นตอ้ งเขียน
โปรแกรมข้ึนมาใหม่ท้งั หมด

โครงสร้างของเฟรมเวิร์กดงั กล่าวท่ีถูกสร้างข้ึนจะถูกเก็บอยู่ในคลาสไลบรารี (Class
Library) ซ่ึงจะเรียกใชไ้ ดโ้ ดยผา่ นเอพไี อของระบบ เป็นตน้

ในการสร้างเฟรมเวิร์กจะมีการสร้างข้อตกลง (Contact) ต่าง ๆ ข้ึนมา ซ่ึงจะใช้เป็ น
ส่วนต่าง ๆ ของเฟรมเวริ ์ก
ข้อตกลง

กิตติ ภกั ดีวฒั นกุลและศิริวรรณ อมั พรดนยั (2544, หนา้ 142) อธิบายวา่ ขอ้ ตกลงหมายถึง
การเห็นดว้ ยระหวา่ งกลุ่มคนมากกวา่ หน่ึงคนท่ีจะทาตามกฎขอ้ บงั คบั ท่ีไดส้ ร้างข้ึน ขอ้ ตกลงน้ีจะทา
ให้ผูพ้ ฒั นาระบบ ผูใ้ ช้ระบบและผทู้ ่ีเกี่ยวขอ้ งกบั ระบบทุกคนทาตามเงื่อนไขของระบบท่ีสร้างข้ึน
ในภาษาจาวามีเครื่องมือท่ีใช้ในการสร้างรูปแบบข้อตกลงดังกล่าวน้ันอยู่ 2 ประเภทคือ
แอบสแตรกคลาส (abstract class) และอินเทอร์เฟส

แอพพลเิ คชันเฟรมเวริ ์ก (Application Framework)

เคย์ ฮอร์สแมนน์ (2002, p.322) กล่าวว่า แอพพลิเคชันเฟรมเวิร์กประกอบด้วยเซตของ
คลาสที่อิมพลีเมนต์ ส่ วนบริ การพ้ืนฐานท่ีแน่ใจว่าจะเป็ นชนิดส่ วนของโปรแกรม ซ่ึ ง
ผพู้ ฒั นาโปรแกรมจะสร้างส่วนที่เป็ นฟังก์ชนั และการใชง้ านอื่น ๆ เพ่ิมเติมเขา้ ไปเพ่ือพฒั นามาเป็ น
โปรแกรมท่ีสามารถใชง้ านได้

คุณลกั ษณะของเฟรมเวริ ์ก
คุณลกั ษณะข้นั แรกสุดจะประกอบดว้ ย 2 ประการคือ
1. แอพพลิเคชนั เฟรมเวิร์กดงั กล่าวตอ้ งมีกลุ่มของคลาสที่ให้ผูพ้ ฒั นาโปรแกรมไดเ้ ขียน
ติดต่อเพ่อื สร้างเป็นโปรแกรมได้
2. แอพพลิเคชนั เฟรมเวิร์กตอ้ งไม่เป็ นคลาสที่เป็ นโปรแกรมโดยตรงแต่จะถูกเรียกใชเ้ มื่อ
ตอ้ งการโดยผพู้ ฒั นาโปรแกรมเท่าน้นั ตวั อยา่ งของเฟรมเวริ ์กในภาษาจาวาเช่น

- Applets Framworke เป็ นเฟรมเวิร์กสาหรับการจดั การงานแสดงผลทางดา้ นกราฟิ ก
บนเวบ็ บราวเซอร์

- Collectiion Framework เป็นเฟรมเวิร์กสาหรับ โครงสร้างขอ้ มูลที่เป็ นชุดเช่นอาร์เรย์
หรือ ลิงคล์ ิสต์ (Link List) เป็นตน้

379

- Graphic Editor Framework เป็ นเฟรมเวิร์กที่ใชส้ าหรับงานทางดา้ นขอ้ มูลชนิดกราฟ
เป็ นตน้

การพฒั นาแอพพลเิ คชันเฟรมเวริ ์ก
การพฒั นาเฟรมเวริ ์กน้นั ตอ้ งพฒั นาเป็ นรอบ ๆ ของการพฒั นาซ่ึงเหตุผลท่ีสาคญั ของการ
พฒั นาหลายรอบดงั กล่าวคือ ผพู้ ฒั นาไม่สามารถศึกษาและออกแบบไดค้ รอบคลุมเน้ือหาไดท้ ้งั หมด
ดงั น้นั ในการพฒั นาจึงจาเป็นตอ้ งพฒั นาเป็นเป็นรอบ ๆ ไป
การพฒั นาเฟรมเวิร์กจะมีลกั ษณะการพฒั นาท่ีคลา้ ยกนั กบั การพฒั นาซอฟตแ์ วร์ท่ีสามารถ
นากลบั มาใช้ใหม่ไดท้ ว่ั ไป กล่าวคือ ตอ้ งเร่ิมพิจารณาท่ีโดเมนของปัญหา กลุ่มของตวั อยา่ งงานท่ี
เก่ียวขอ้ ง ข้นั แรกสุดน้นั ควรเป็ นเฟรมเวิร์กท่ีสามารถอิมพลีเมนต์ไดจ้ ริงกบั ตวั อย่างซ่ึงจะเป็ นการ
พฒั นาแบบไวต์บอกซ์ (White Box) ก่อนหลงั จากน้นั จึงพฒั นาในรอบต่อ ๆ ไป ซ่ึงการพฒั นาใน
รอบ ตอ่ ๆ ไปจะข้ึนอยกู่ บั เหตุผลดงั ตอ่ ไปน้ี
1. เพื่อให้แน่ใจว่าโดเมนท่ีพิจารณานามาสร้างน้นั ถูกตอ้ งชดั เจน ตามท่ีตอ้ งการจริง ๆ
หากไมถ่ ูกตอ้ งหรือตอ้ งการเพม่ิ เติมจะไดป้ รับปรุงในทนั ที
2. เพ่อื ใหท้ ราบเก่ียวกบั การเปล่ียนแปลงของแต่ละส่วนของการออกแบบเฟรมเวิร์กวา่ จะ
เปล่ียนแปลงไดโ้ ดยง่ายหรือจะกาหนดใหเ้ ป็ นแบบไม่จาเป็ นตอ้ งเปล่ียนแปลง ซ่ึงการเปล่ียนแปลง
คุณลกั ษณะดงั กล่าวจะตอ้ งข้ึนอยกู่ บั ประสบการณ์ของผอู้ อกแบบเอง
3. เพื่อใหท้ ราบวา่ จะกาหนดส่วนแอบสแทรกท่ีเหมาะสมไดเ้ พราะการกาหนดส่วนที่เป็ น
แอบสแทรกคลาสน้ีข้ึนอยกู่ บั ตวั อยา่ งที่นามาพฒั นาในเวอร์ชนั แรก ๆ
ดงั น้นั ในการพฒั นาเฟรมเวิร์กผูพ้ ฒั นาตอ้ งกาหนดโดเมน และสร้างตวั อย่างการทางานท่ี
สามารถใช้งานได้จริง แล้วจึงศึกษาเพื่อพัฒนาในเวอร์ชันต่อ ๆ มาเพื่อให้ได้เฟรมเวิร์กที่มี
ประสิทธิภาพตรงตามความตอ้ งการการใช้งาน ยืดหยุ่น และสามารถนาไปปรับใช้ได้อย่างมี
ประสิทธิผล ตวั อยา่ งเฟรมเวิร์กในภาษาจาวา คือ แพคเกจของ แอบเพล็ต (applet) ที่มีใชง้ านอยใู่ น
java.applet ให้พิจารณาตวั อยา่ งของโครงสร้างการทางานของจาวาแอบเพล็ตทุกส่วนโปรแกรมท่ี
สร้างดว้ ยแอบเพล็ตตอ้ งมี ตวั อย่างของโปรแกรมท่ีสร้างจากจาวแอบเพล็ต และเฟรมเวิร์กของการ
สร้างจาวาเซอร์ฟเวอร์เฟส (Java Server Faces: JSF) ท่ีเป็ นโครงสร้างการพฒั นาเวบ็ แนวใหม่
ตวั อยา่ งของโปรแกรมแอบเพลต็ ดงั รหสั โปรแกรมดงั น้ี

import java.applet.Applet;
import java.awt.Graphics;
public class ExAppletFramework extends Applet {

380

public void init() {
//ส่วนการทางานเมื่อเร่ิมตน้ และการกาหนดคา่ ทางานแรกสุด

}
public void stop(){

//ส่วนการทางานเม่ือแอบเพลต็ หยดุ
}
public void start(){

//ส่วนการทางานเมื่อแอบเพลต็ เริ่มตน้ ทางาน
}
public void paint(Graphics g){

//ส่วนการวาดภาพกราฟิ ก
}
}

จากโครงโปรแกรมพบว่าเมธอดต่าง ๆ เรียกใช้งานดงั กล่าวน้ันเกิดจากการสร้างไวข้ อง
java.applet ท่ีทุก ๆ โปรแกรมท่ีสืบทอดคุณสมบตั ิไปน้นั ตอ้ งมี และสามารถสั่งดาเนินการได้
เหมือนกนั

ตวั อย่างท่ี 10.6 จากโครงของเฟรมเวริ ์กแอบเพลต็ ดงั กล่าวจงเขียนโปรแกรมเพื่อแสดงชื่อตนเอง
ดว้ ยจาวาแอบเพล็ต
โปรแกรม :
----------------------------------------------------------------------------------------------------------------------
port java.applet.Applet;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class ExAppletFramework extends Applet {

Graphics2D g2d;
String msg;
Font font;
public void init() {

381

g2d = (Graphics2D) getGraphics();
}
public void stop(){

}
public void start(){

msg="Mr.Hero Thailand.";
font=new Font("Angsana New",Font.PLAIN,150);
}
public void paint(Graphics g){
g2d.setFont(font);
g2d.drawString(msg, 20, 100);

}
}
--------------------------------------------------------------------------------------------------------------------
ผลการรันโดยใช้ Applet Viewer หรือรันโดยเวบ็ บราวเซอร์จะไดด้ งั น้ี

ภาพที่ 10.13 แสดงผลการรันของตวั อยา่ งที่ 10.6

ตวั อย่างแอพพลิเคชนั เฟรมเวิร์กระดบั สูงท่ีมีความซบั ซอ้ นมากข้ึน โดยเฉพาะอยา่ งย่ิงจาก
ภาษาจาวาท่ีผนวกกบั โปรแกรมเน็ตบีน ต้งั แต่เวอร์ชนั 5 ข้ึนมาไดแ้ ก่ JSF Visual JSF Framework ท่ี
ช่วยในการสร้างเวบ็ แบบ JSF ตามแนวทางแดร็กแอนดด์ ร็อป ของการพฒั นาโปรแกรมแนวใหม่ มี
โครงสร้างเฟรมเวริ ์ก ดงั น้ี

382

ภาพท่ี 10.14 แสดงเฟรมเวริ ์กของ JSF เฟรมเวริ ์ก
(ที่มา: จากเวบ็ ไซดข์ องบริษทั ซนั ไมโครซิสเตม็ )
ส่วนประกอบของเฟรมเวริ ์กน้ีจะสร้างส่วนการติดต่อกบั ผใู้ ชท้ ่ีส่วนเวบ็ เซอร์ฟเวอร์โดยจะ
สร้างส่วนการพฒั นาที่เนน้ ความสวยงาม สะดวก ต่อผใู้ ช้และผพู้ ฒั นา เฟรมเวิร์กน้ีใชส้ าหรับการ
พฒั นาเว็บแอพพลิเคชัน ของบริษทั ซันไมโครซิสเต็มที่สร้างข้ึนเพื่อให้การสร้างเว็บเป็ นแบบ
เดียวกบั การพฒั นาแอพพลิเคชัน โดยเฉพาะอยา่ งยิ่งส่วนติดต่อกบั ผใู้ ชง้ านจะเป็ นกราฟิ กท้งั หมด
รวมท้งั การพฒั นายงั เป็นแนวทางเชิงวตั ถุอยา่ งสมบรู ณ์แบบอีกดว้ ย
นอกเหนือจากค่ายเปิ ดของซนั ไมโครซิสเต็มแลว้ ยงั มีเฟรมเวริ ์กของบริษทั ไมโครซอฟตท์ ่ี
พฒั นา .NET Framework สาหรับการพฒั นาโปรแกรมและเวบ็ แอพพลิเคชนั ตามแนวทาง .NET
แนวใหมอ่ ีกดว้ ย โครงสร้างของเฟรมเวริ ์กดงั ภาพ

ภาพท่ี 10.15 แสดงเฟรมเวริ ์ก ของ .NET เฟรมเวริ ์ก
(ที่มา : จากเวบ็ ไซดข์ องบริษทั ไมโครซอฟต)์

383

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

ผใู้ ชง้ านตอ้ งติดโปรแกรมเน็ตบีนต้งั แต่เวอร์ชนั 5 ข้ึนมา แลว้ ดาเนินการสร้างตามข้นั ตอน
ต่อไปน้ี

1. สร้างโปรเจคท่ีเป็นเวบ็ แอพพลิเคชนั ดงั ภาพ

ภาพท่ี 10.16 แสดงการสร้างเวบ็ แอพพลิเคชนั โปรเจคจากเน็ตบีน 6.0
2. กาหนดตาแหน่งการเก็บโปรเจค

384

ภาพที่ 10.17 แสดงการเลือกตาแหน่งการจดั เก็บ
3. เลือกเฟรมเวิร์กเพ่ือใชง้ าน ในท่ีน้ีเลือก Visual Web JavaServer Faces และ JavaServer
Faces ดงั ภาพ

ภาพที่ 10.18 แสดงการเลือกเฟรมเวิร์กสาหรับเขียนโปรแกรม
4. เม่ือเลือก Finish โปรแกรมเน็ตบีนจะสร้างส่วนการสร้างเวบ็ แอพพลิเคชนั ดงั ภาพ

385

ภาพท่ี 10.19 แสดงหนา้ ต่างการสร้างเวบ็ แอพพลิเคชนั ดว้ ย JSF เฟรมเวริ ์ก
จากภาพพบวา่ การพฒั นาเวบ็ แอพพลิเคชนั สามารถแดร็กคอมโพเนนต์ต่าง ๆ เช่น Label,
Static Text, Hyperlink และอื่น ๆ หลงั จากน้นั กาหนดคุณสมบตั ิ และสามารถเขา้ ไปเขียนโปรแกรม
ส่วนของเมธอด ไดเ้ ช่นเดียวกบั การเขียนโปรแกรมเชิงวตั ถุทว่ั ไป
ตัวอย่างที่ 10.8 จากการสร้างโปรเจค เกี่ยวกบั JSF เฟรมเวิร์ก จงสร้างตวั อยา่ งโฮมเพจอยา่ งง่ายโดย
ใชว้ ธิ ีการเขียนโปรแกรมแบบแดร็กแอนดด์ ร็อป

ภาพท่ี 10.20 แสดงหนา้ ต่างการออกแบบดว้ ยการแดร็กแอนดรอป

386

ผลการรัน บนเวบ็ บราวเซอร์ แสดงดงั น้ี

ภาพท่ี 10.21 แสดงหนา้ ตา่ งการรันโปรแกรมบนบราวเซอร์
จากตวั อย่างดงั กล่าวน้ี พบวา่ ผทู้ ่ีเขียนโปรแกรมไม่จาเป็ นตอ้ งเขียนโปรแกรม แต่สามารถ
สร้างเวบ็ แอพพลิเคชันเบ้ืองตน้ ไดอ้ ย่างรวดเร็ว และในปัจจุบนั น้ีไดม้ ีเฟรมเวิร์กต่าง ๆ ถูกสร้าง
ข้ึนมาเพื่ออานวยความสะดวกสาหรับการพฒั นาโปรแกรมแก่โปรแกรมเมอร์รุ่นใหม่ให้สามารถ
สร้างงานเชิงธุรกิจไดอ้ ยา่ งรวดเร็ว

สรุป

ดีไซน์แพทเทิร์น คือ กลุ่มคลาสหรือแพคเกจสาหรับจดั การปัญหาต่าง ๆ ของการเขียน
โปรแกรมเชิงวตั ถุ แบ่งออกเป็ น 3 กลุ่มคือกลุ่มการแกป้ ัญหาในเร่ืองการสร้างวตั ถุจานวนมากเพื่อ
เลือกใช้ตอนรันโปรแกรมแล้ว กลุ่มท่ีสองคือกลุ่มที่ช่วยในการแก้ปัญหาด้านโครงสร้างของ
โปรแกรมท่ีมีการสร้างวตั ถุในเชิงโครงสร้าง และกลุ่มที่สามคือกลุ่มของการจดั การ เรื่องพฤติกรรม
ของวตั ถุท่ีมีหลากหลายในตอนรันโปรแกรม การนาดีไซน์แพทเทิร์นไปใชง้ านน้นั จะตอ้ งออกแบบ
เองและเขียนโปรแกรมข้ึนมาใหม่เสมอ ยกเวน้ เฉพาะในส่วนของโปรแกรมภาษาจาวาท่ีไดจ้ ดั เตรียม
ดีไซน์แพทเทิร์นสาหรับบางชนิดไวใ้ หใ้ ช้แลว้ เฟรมเวิร์กเป็ นแนวทางการพฒั นาโปรแกรมข้นั สูง
กวา่ ดีไซน์แพทเทิร์นโดยทว่ั ไปแลว้ อาจนาดีไซน์แพทเทิร์นมาประกอบกนั เพื่อสร้างการทางานโดย
ท่ีผเู้ ขียนโปรแกรมสามารถเรียกใช้งานไดท้ นั ทีโดยแทบจะไม่ตอ้ งเขียนโปรแกรมเพิ่มเติมแต่อยา่ ง
ใด

387

แบบฝึ กหดั ท้ายบท

1. ดีไซน์แพทเทิร์นคืออะไร ดีไซน์แพทเทิร์นมีก่ีประเภท แต่ละประเภทแกป้ ัญหาในการ
เขียนโปรแกรมเชิงวตั ถุในดา้ นใดบา้ ง

2. จงบอกว่าดีไซน์แพทเทิร์นต่อไปน้ีเป็ นดีไซน์แพทเทิร์นกลุ่มใด ไดแ้ ก่ Composite,
Iterator, Mediator, Proxy, Adapter, Abstract และ Factory

3. หากท่านมีปัญหาในการจดั รูปแบบของโปรแกรมตกแต่งบา้ น ท่านจะเลือกดีไซน์แพ
ทเทิร์นแบบใดมาแกป้ ัญหา

4. จงบอกขอ้ ดี และขอ้ เสียของการใช้งานดีไซน์แพทเทิร์นในเชิงการเขียนโปรแกรมเชิง
วตั ถุ

5. หากท่านต้องเขียนโปรแกรมสาหรับการตรวจสอบอุปกรณ์ของคอมพิวเตอร์ภายใน
เคร่ืองเดียว ท่านจะออกแบบโดยใชด้ ีไซน์แพทเทิร์นแบบใด เพราะเหตุใด

6. จงออกแบบและเขียนโปรแกรมการเลือกโมเดลของเคร่ืองบิน ท่ีลูกคา้ สามารถเลือกได้
ตามท่ีตอ้ งการ

7. หากตอ้ งเขียนโปรแกรมตวั แปลภาษาคอมพิวเตอร์ เช่น HTML, XML ท่านจะเลือกใช้
ดีไซน์ แพทเทิร์นแบบใด เพราะเหตุใด

8. จงบอกขอ้ ดี และขอ้ เสียของการออกแบบโดยใชด้ ีไซน์แพทเทิร์นแบบ Adapter
9. จงบอกช่ือเวบ็ ไซดท์ ่ีใหค้ วามรู้เร่ืองดีไซน์แพทเทิร์นมาอยา่ งนอ้ ย 5 เวบ็ ไซด์
10. จงบอกชื่อเฟรมเวิร์กท่ีท่านรู้จกั มาอย่างนอ้ ย 2 ช่ือ พร้อมท้งั อธิบายประโยชน์ของการ
ทางานเฟรมเวริ ์กน้นั ๆ พอสังเขป
11. เฟรมเวริ ์กคืออะไร มีประโยชน์อยา่ งไร
12. GOF คืออะไร มีความสาคญั อยา่ งไร
13. หากท่านเลือกที่จะพฒั นาโปรแกรมบนมือถือระบบปฏิบตั ิการ Android ท่านคิดวา่ จะใช้
เฟรมเวริ ์กใดในการเขียนโปรแกรม
14. จงอธิบายวา่ Ajax, JSF และ .NET Framework แตกตา่ งกนั อยา่ งไร
15. จงเขียนโปรแกรมโดยใช้ JSF Framework เพ่ือแสดงรายงานขอ้ มูลในฐานขอ้ มูลที่ท่าน
กาหนดเอง

388

เอกสารอ้างองิ

กิตติ ภกั ดีวฒั นกุล. (2543 ก). JAVA ฉบับพนื้ ฐาน. กรุงเทพฯ: ไทยเจริญการพมิ พ.์
_________. (2543 ข). JAVA ฉบับโปรแกรมเมอร์. กรุงเทพฯ: ไทยเจริญการพิมพ.์
กิตติ ภกั ดีวฒั นะกุล และ ศิริวรรณ อมั พรดนยั . (2544). Oject-Oriented ฉบับพนื้ ฐาน. กรุงเทพฯ:

KTP Comp&Consult.
กิตติพงษ์ กลมกล่อม. (2552). การวเิ คราะห์และออกแบบระบบเชิงวตั ถุด้วย UML. กรุเทพฯ: เคทีพี

แอนด์ คอนซลั ท.์
ธีรวฒั น์ ประกอบผล. (2552). คู่มอื การเขยี นโปรแกรมภาษา Java. กรุงเทพฯ: ซคั เซส มีเดีย.
_________. (2553). คู่มือการเขยี นโปรแกรมภาษา Java. กรุงเทพฯ: ซิมพลิฟลาย.
พนิดา พานิชกุล. (2548). Object-Oriented ฉบบั พนื้ ฐาน. กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
_________. (2554). การเขียนโปรแกรมคอมพิวเตอร์เบือ้ งต้นด้วยภาษาจาวา. พิมพค์ ร้ังท่ี 5.

กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
สมโภชน์ ชื่นเอ่ียม. (2553). วทิ ยาการคอมพวิ เตอร์เบอื้ งต้น. กรุงเทพฯ: ซีเอด็ ยเู คชนั .
Brett Spell. (2000). Professional Java Programming. USA: Wrox Press Ltd. Arden House, 1102

Warwick Road, Acocks Green, Birmingham, B27 6BH, UK.
Bruce Eckel. (2000). Thinking in Java. 2nd . USA: Prentice Hall PTR Prentice-Hall.
Cay Horstmann. (2002). Object-Oriented Design & Patterns. USA: John Wiley & Sons.
David Etheridge. (2009). Java:The Fundamentals of Objects and Classes-An Introduction to

Java Programming. Ventus Publishing Aps. [Online]. Available:
http://www.BookBoon.com.
Eric Braude. (2004). Software Design. USA: JOYHN WILEY & SONS, Inc.
Simol Kendal. (2009). Object Orientted Programming using Java. Ventus Publishing Aps.
[Online]. Available: http://www.BookBoon.com
wikipedia. (2007). “Object-oriented programming”. [Online] Available:
http://en.wikipedia.org/wiki/Object-oriented_programming.
Y. Daniel Liang. (2007). Introduction to Java Programming. USA: Pearson Prentice Hall
Pearson Education, Inc.

บรรณานุกรม

กระทรวงศึกษาธิการ. (2533). หลักการเขียนโปรแกรม คพ.ทป. 014 ระดับม.ปลาย. กรุงเทพฯ:
องคก์ ารคา้ คุรุสภา.

“การโปรแกรมเชิงวัตถุ และยูเอม็ แอล (UML - Unified Modeling Language)”. (2011). [Online].
Available: http://www.thaiall.com/uml/indexo.html.

กิตติ ภกั ดีวฒั นกลุ . (2543 ก). JAVA ฉบับพนื้ ฐาน. กรุงเทพฯ: ไทยเจริญการพิมพ.์
_________. (2543 ข). JAVA ฉบบั โปรแกรมเมอร์. กรุงเทพฯ: ไทยเจริญการพมิ พ.์
กิตติ ภกั ดีวฒั นะกุล และกิตติพงษ์ กลมกล่อม. (2548). คัมภีร์ การวิเคราห์และออกแบบเชิงวัตถุ

ด้วย UML. กรุเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
กิตติ ภกั ดีวฒั นะกุล และ ศิริวรรณ อมั พรดนยั . (2544). Oject-Oriented ฉบับพนื้ ฐาน. กรุงเทพฯ:

KTP Comp&Consult.
ครรชิต มาลัยวงศ์ และ วิชิต ปุณวตั ร์ . (2536). เทคนิคการออกแบบโปรแกรม. กรุงเทพฯ:

ซีเอด็ ยเู คชนั .
ธนญั ชยั ตรีภาค. (2553). คอมพวิ เตอร์และการเขยี นโปรแกรม (Computers and Programming) C

และ Java. กรุงเทพฯ: ซีเอด็ ยเู คชนั .
ธีรวฒั น์ ประกอบผล. (2552). คู่มือการเขยี นโปรแกรมภาษา Java. กรุงเทพฯ: ซคั เซส มีเดีย.
_________.ธีรวฒั น์ ประกอบผล. (2545). การโปรแกรมภาษาซีสาหรับงานวิทยาศาสตร์ .

กรุงเทพฯ: ส.ส.ท.
นุกลู กระจาย. (2540). การเขียนโปรแกรมในดอสและวนิ โดว์ด้วยบอร์แลนด์ C++ 5.0. กรุงเทพฯ:

ซีเอด็ ยเู คชนั .
บุญเลิศ เอี่ยมทศั นาและคณะ. (2534). โปรแกรมคอมพวิ เตอร์ภาษาซี.กรุงเทพฯ: ซีเอด็ ยเู คชนั .
พนิดา พานิชกลุ . (2548). Object-Oriented ฉบบั พนื้ ฐาน. กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
_________. (2554). การเขียนโปรแกรมคอมพิวเตอร์เบือ้ งต้นด้วยภาษาจาวา. พิมพ์คร้ังที่ 5.

กรุงเทพฯ: เคทีพี แอนด์ คอนซลั ท.์
พเิ ชษฐ์ ศิริรัตนไพศาลกลุ . (2553). หลกั การเขียนโปรแกรมเบือ้ งต้นด้วยภาษา JAVA. กรุงเทพฯ:

ซีเอด็ ยเู คชนั .
เพญ็ ศรี ปักกะสีนงั . (2546). เทคโนโลยสี ารสนเทศเพอ่ื ชีวติ . กรุงเทพฯ: ทริปเพิล้ เซเวน่ มลั ติเทค.

390

วชั ราภรณ์ สุริยาภิวฒั น์. (2553). คอมพิวเตอร์เบื้องต้นและเทคนิคการเขียนโปรแกรม. กรุงเทพฯ:
ศูนยห์ นงั สือแห่งจุฬาลงกรณ์มหาวทิ ยาลยั .

รุ่งโรจน์ โพนคาและปราลี มณีรัตน์. (2545). Advanced JAVA Programming ฉบับสร้าง
แอพพลเิ คชั่นด้วยจาวาสวงิ ซ์. กรุงเทพฯ: ซคั เซส มีเดีย.

วรี ะศกั ด์ิ ซึงถาวร. (2545 ก). JAVA Programming volumn I. กรุงเทพฯ: ซีเอด็ ยเู คชนั .
_________. (2545 ข). JAVA Programming volumn II. กรุงเทพฯ : ซีเอด็ ยเู คชนั .
_________. (2547). JAVA Programming volumn III. กรุงเทพฯ : ซีเอด็ ยเู คชนั .
สมโภชน์ ชื่นเอ่ียม. (2553). วทิ ยาการคอมพวิ เตอร์เบือ้ งต้น. กรุงเทพฯ: ซีเอด็ ยเู คชนั .
อนรรฆนงค์ คุณมนี. (2551). คู่มอื เขียนโปรแกรมภาษา JAVA ฉบับผู้เร่ิมต้น. กรุงเทพฯ: ไอดีซี อิน

โฟ ดิสทริบิวเตอร์ เซ็นเตอร์.
อรพนิ ประวตั ิบริสุทธ์ิ. (มปป.). คู่มือการเขียนโปรแกรมภาษา JAVA. กรุงเทพฯ:โปรวชิ นั่ .
_________. (2552). คู่มอื เรียนภาษาซี ฉบับปรับปรุงใหม่. กรุงเทพฯ: ซีเอด็ ยเู คชนั .
โอภาส เอ่ียมสิริวงศ์. (2549). โครงสร้างข้อมูล (Data Structures) เพ่ือการออกแบบโปรแกรม

คอมพวิ เตอร์. กรุงเทพฯ: ซีเอด็ ยเู คชนั .
Allen B. Downey.(2011). How to Think Like a Computer Scientist Java Version. Ventus

Publishing Aps. [Online]. Available: http://www.BookBoon.com.
beginner-java-tutorial.com. (2007 A). “BorderLayout”. [Online]. Available:

http://www.beginner-java-tutorial.com/borderlayout.html.
_________. (2007 B). “FlowLayout”. [Online]. Available: http://www.beginner-java-

tutorial.com/flowlayout.html.
_________. (2007 C). “Java JButton class example”. [Online]. Available: http://www.beginner

-java-tutorial.com/jbutton.html.
_________.(2007 D). “Java JCheckBox class example”. [Online]. Available:

http://www.beginner-java-tutorial.com/jcheckbox.html.
_________. (2007 E). “Java JComboBox class example”. [Online]. Available:

http://www.beginner-java-tutorial.com/jcombobox.html.
_________. (2007 F). “JFrame”. [Online]. Available: http://www.beginner-java-tutorial.com/

jframe.html.
_________. (2007 G). “Java JLabel class example”. [Online]. Available: http://www.beginner-

java-tutorial.com/jlabel.html.

391

_________. (2007 H). “Java JList class example”. [Online]. Available: http://www.beginner-
java-tutorial.com/jlist.html.

_________. (2007 I). “Java JPasswordField class example”. [Online]. Available:
http://www.beginner-java-tutorial.com/jpasswordfield.html.

_________. (2007 J). “Java JTextArea class example”. [Online]. Available:
http://www.beginner-java-tutorial.com/jtextarea.html.

_________. (2007 K). “Java JTextField class example”. [Online]. Available:
http://www.beginner-java-tutorial.com/jtextfield.html.

_________. (2007 L). “Java JRadioButton class example”. [Online]. Available:
http://www.beginner-java-tutorial.com/jradiobutton.html.

Brett Spell. (2000). Professional Java Programming. USA: Wrox Press Ltd. Arden House, 1102
Warwick Road, Acocks Green, Birmingham, B27 6BH, UK.

Bruce Eckel. (2000). Thinking in Java. 2nd . USA: Prentice Hall PTR Prentice-Hall.
Cay Horstmann. (2002). Object-Oriented Design & Patterns. USA: John Wiley & Sons.
“Characters”.(2009). [Online] Available: java.sun.com/docs/books/tutorial/java/data

/characters.html.
David Etheridge. (2009 A). Java:The Fundamentals of Objects and Classes-An Introduction

to Java Programming. Ventus Publishing Aps. [Online]. Available:
http://www.BookBoon.com.
_________. (2009 B). Java: Classes in Java Applications An Introduction to Java
ProGramming. Ventus Publishing Aps. [Online]. Available:
http://www.BookBoon.com.
Eric Braude. (2004). Software Design. USA: JOYHN WILEY & SONS, Inc.
“Files I/O”. (2009). [Online]. Available : http://java.sun.com/docs/books/tutorial/essential/io/
fileio.html.
“Getting Started”. (2009). [Online]. Available : http://java.sun.com/docs/books/tutorial
/getStarted/index.html.
“How to read from standard input”. (2009). [Online]. Available : www.java2s.com/
Code/Java/Development-Class/Commandlineinput.htm.
Itemelody. (2007). “ค่าคงท่ี และชนิดข้อมูล” . (Literal & Data Type) . [Online]. Available :
http://www.itmelody.com/tu/java3.html.

392

James W. Cooper.(1998). The Design Patterns Java Companion. USA: Addison-Wesley.
Javaunkies.org. (2007). Java Basics: Data Types [Online]. Available :

http://www.javajunkies.org/index.pl?lastnode_id=888&node_id=893.
“JDKTM 6 Documentation”.(2009). [Online] Available: http://java.sun.com/javase/6/docs/

index.html.
“Java Operators”. (2009). [Online]. Available : http://www.ibiblio.org/java

/course/week2/03.html.
“JavaTM Platform, Standard Edition 6 Overview”. (2009). [Online] Available:

http://java.sun.com/javase/6/docs/technotes/guides/index.html.
Justin Simmons. (2007). Java Programming. India: Globol Media.
“Lesson: Basic I/O”. (2009). [Online]. Available: http://java.sun.com/docs/books

/tutorial/essential/io/index.html.
“Lesson: Exceptions”. (2009). [Online]. Available: http://java.sun.com/docs/books/tutorial

/essential/exceptions/.
“Lesson: Numbers and Strings”. (2009). [Online]. Available: http://java.sun.com/docs/books

/tutorial/java/data/index.html.
“Lesson 3:Loop”. (2007). [Online]. Available: http://www.cprogramming.com

/tutorial/lesson3.html.
Nathaniel T. Schutta and Ryan Asleson. (2006). Pro Ajax and Java. USA: Apress.
Object Management Group. (2011 A). “Unified Modeling Language”. [Online]. Available:

http://www.uml.org/.
_______. (2011 B). “Introduction to OMG's Unified Modeling Language™ (UML®)”. [Online].

Available: http://www.omg.org/gettingstarted/what_is_uml.htm.
_______. (2011 C). “Catalog of UML Profile Specifications”. [Online]. Available:

http://www.omg.org/technology/documents/profile_catalog.htm.
_______. (2011 D). “UML Vendor Directory Listing”. [Online]. Available: http://uml-

directory.omg.org/vendor/list.htm.
“Operators”. (2009). [Online]. Available: http://java.sun.com/docs/books/tutorial/java

/nutsandbolts/operators.html.
“Reading and writing text files”. (2009). [Online]. Available: http://www.javapractices.com/

topic/TopicAction.do?Id=42.

393

Robert Eckstein, Morc Loy and Dave Wood. (1988). Java Swing. USA: O'Reilly & Associates.
Robert Lafore. (2003). Data Structures & Algorithms in Java second Edition . 2nd . USA:

Sams Publishing. 201 West 103rd Street, Indeanapolis, Indiana.
Shahrooz Feizabadi. (2007). History of Java. [Online]. Available :

http://ei.cs.vt.edu/~wwwbtb/book/chap1/java_hist.html.
Simol Kendal. (2009). Object Orientted Programming using Java. Ventus Publishing Aps.

[Online]. Available: http://www.BookBoon.com.
Sparx Systems. (2011 A). “UML 2.3 Tutorial”. [Online]. Available: http://www.sparx

systems.com.au/resources /uml2_tutorial/
_______. (2011 B). “UML Tutorial”. [Online]. Available: http://www.sparx

systems.com.au/uml-tutorial.html.
Stephen Stelting and Olav Maassen. (2001). Applied JavaTM Patterns. USA: Prentice Hall

PTR. Ian Darwin, (2001). Java Cookbook. USA: O’Reilly.
Sun Microsystems. (2007 A). “Class ButtonGroup” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/ButtonGroup.html.
_________. (2007 B). “Class JCheckBox” [Online]. Available:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JCheckBox.html
_________. (2007 C). “Class JDesktopPane” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/JDesktopPane.html.
_________. (2007 D). “Class JInternalFrame” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html.
_________. (2007 E). “Class JList” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/JList.html
_________. (2007 F). “Class JProgressBar” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/JProgressBar.html.
_________. (2007 G). “Class ScrollBar” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/JScrollBar.html.
_________. (2007 H). “Class JSlider” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/JSlider.html.
_________. (2007 I). “Class JSpinner” [Online]. Available: http://java.sun.com

/j2se/1.4.2/docs/api/javax/swing/JSpinner.html.

394

_________. (2007 J). “Class JSplitPane” [Online]. Available: http://java.sun.com
/j2se/1.4.2/docs/api/javax/swing/JSplitPane.html.

_________. (2007 K). “Class JTabbedPane” [Online]. Available: http://java.sun.com
/j2se/1.4.2/docs/api/javax/swing/JTabbedPane.html.

_________. (2007 L). “Primitive Data Types”. [Online]. Available : http://java.sun.com
/docs/books/tutorial/java/nutsandbolts/datatypes.html.

_________. (2007 M). “What Is a Class” . [Online]. Available. http://java.sun.com
/docs/books/tutorial/java/concepts/class.html

_________. (2007 N). “Class JSplitPane” [Online]. Available: http://java.sun.com
/j2se/1.4.2/docs/api/javax/swing/JSplitPane.html.

"UML Basic Notations". (2011). [Online]. Available: http://www.tutorialspoint.com/
uml/uml_basic_notations.htm.

Wikipedia. (2007 A). “Class (computer science)”. [Online]. Available: http://en.wikipedia.org
/wiki/Class_%28computer_science%29

_________. (2007 B). “Java (programming language)”. [Online]. Available :
http://en.wikipedia.org/wiki/Java_(programming_language).

_________. (2007 C). “Object-oriented programming”. [Online] Available: http://en.wikipedia
.org/wiki/Object-oriented_programming.

_______. (2011 A). “Unified Modeling Language”. [Online]. Available: http://en.wikipedia.org
/wiki/Unified_Modeling_Language.

_______. (2011 B). “Class diagram”. [Online]. Available: http://en.wikipedia.org/wiki
/Class_diagram.

_______. (2011 C). “Component diagram”. [Online]. Available: http://en.wikipedia.org/wiki
/Component_diagram.

_______. (2011 D). “Composite structure diagram”. [Online]. Available: http://en.wikipedia.org
/wiki/Composite_structure_diagram

_______. (2011 E). “Deployment diagram” . [Online]. Available: http://en.wikipedia.org
/wiki/Deployment_diagram.

_______. (2011 F). “Object diagram”. [Online]. Available: http://en.wikipedia.org
/wiki/Object_diagram.


Click to View FlipBook Version