แบบแผนแฟกทอรีเมธอด (Factory method pattern) เป็นแบบแผนการออกแบบซอฟต์แวร์ที่นิยามเมธอดสำหรับสร้างอ็อบเจกต์ของคลาสชนิดหนึ่งๆ แต่ไม่ได้เจาะจงชนิดที่แน่นอน ซับคลาสเป็นผู้กำหนดเจาะจงว่าจะสร้างอ็อบเจกต์ของคลาสใด แฟกทอรีเมธอดในความหมายโดยทั่วไปคือเมธอดที่ทำหน้าที่สร้างอ็อบเจกต์นั่นเองแบบแผนแฟกทอรีเมธอดจะถูกใช้ร่วมกับแบบแผนเทมเพลตเมธอด (Template method pattern) โดยถูกเรียกใช้งานจากในเทมเพลตเมธอด
การนำไปใช้งาน
องค์ประกอบของแบบแผนแฟกทอรีเมธอดมีดังนี้
- ผลิตภัณฑ์ (Product) นิยามอินเตอร์เฟสของของอ็อบเจกต์ที่แฟกทอรีเมธอดจะเป็นผู้สร้าง
- ผลิตภัณฑ์รูปธรรม (Concrete product) ตัวคลาสที่แท้จริงที่จะถูกสร้างโดยแฟกทอรีเมธอด
- คลาสนามธรรม (Abstract class) เป็นผู้กำหนดแฟกทอรีเมธอด โดยสร้างเป็นเมธอดนามธรรม (Abstract method)
- คลาสรูปธรรม (Concrete class) ซับคลาสของคลาสนามธรรม กำหนดรายละเอียดของแฟกทอรีเมธอดที่ถูกนิยามในคลาสแม่
ตัวอย่างโค้ด
ภาษาจาวา
ตัวอย่างโปรแกรมคำนวณหาปริมาตรของรูปทรงกระบอกซึ่งมีสูตรดังนี้
ปริมาตร = พื้นที่ฐาน * ความสูง
โดยที่
- แฟกทอรีเมธอดทำหน้าที่สร้างรูปวงกลม
- ปริมาตรของทรงกระบอกคือผลคูณของความสูงและพื้นที่ฐานจากรูปวงกลมที่ถูกสร้างโดยแฟกทอรีเมธอด
คลาสนามธรรม Container
นิยามแฟกทอรีเมธอด createBase()
getHeight()
และ getVolume()
ซึ่งเป็นเทมเพลตเมธอดมีรายละเอียดการคำนวณหาปริมาตร
public abstract class Container { /** * Factory method */ public abstract TwoDShape createBase(); public abstract double getHeight(); /** * Template method */ public double getVolume() { return createBase().getArea() * getHeight(); } }
คลาสรูปธรรม Cylinder
สร้างรูปวงกลม Circle
ในแฟกทอรีเมธอด createBase()
public class Cylinder extends Container { private double radius; private double height; public Cylinder(double radius, double height) { this.radius = radius; this.height = height; } @Override public TwoDShape createBase() { return new Circle(radius); } @Override public double getHeight() { return height; } }
คลาส TwoDShape
และ Circle
public interface TwoDShape { public double getArea(); } public class Circle implements TwoDShape { private double radius; public Circle(double radius) { this.radius = radius; } public double getArea() { return Math.PI * radius * radius; } }
อ้างอิง
- Design Patterns: Elements of Reusable Object-Oriented Software () โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides (Gang of four: GoF)
แหล่งข้อมูลอื่น
- โดย Vince Huston (อังกฤษ)
- Pattern Summaries: Factory Method 2007-08-24 ที่ เวย์แบ็กแมชชีน โดย Mark Grand (อังกฤษ)
- The Factory Method (Creational) Design Pattern โดย Gopalan Suresh Raj (อังกฤษ)
- Factory Method Pattern[] โดย OOSE Student (ไทย)
wikipedia, แบบไทย, วิกิพีเดีย, วิกิ หนังสือ, หนังสือ, ห้องสมุด, บทความ, อ่าน, ดาวน์โหลด, ฟรี, ดาวน์โหลดฟรี, mp3, วิดีโอ, mp4, 3gp, jpg, jpeg, gif, png, รูปภาพ, เพลง, เพลง, หนัง, หนังสือ, เกม, เกม, มือถือ, โทรศัพท์, Android, iOS, Apple, โทรศัพท์โมบิล, Samsung, iPhone, Xiomi, Xiaomi, Redmi, Honor, Oppo, Nokia, Sonya, MI, PC, พีซี, web, เว็บ, คอมพิวเตอร์
aebbaephnaefkthxriemthxd Factory method pattern epnaebbaephnkarxxkaebbsxftaewrthiniyamemthxdsahrbsrangxxbecktkhxngkhlaschnidhnung aetimidecaacngchnidthiaennxn sbkhlasepnphukahndecaacngwacasrangxxbecktkhxngkhlasid aefkthxriemthxdinkhwamhmayodythwipkhuxemthxdthithahnathisrangxxbecktnnexngaebbaephnaefkthxriemthxdcathukichrwmkbaebbaephnethmephltemthxd Template method pattern odythukeriykichngancakinethmephltemthxdkarnaipichnganUML okhrngsrangkhxngethmephltemthxd xngkhprakxbkhxngaebbaephnaefkthxriemthxdmidngni phlitphnth Product niyamxinetxrefskhxngkhxngxxbecktthiaefkthxriemthxdcaepnphusrang phlitphnthrupthrrm Concrete product twkhlasthiaethcringthicathuksrangodyaefkthxriemthxd khlasnamthrrm Abstract class epnphukahndaefkthxriemthxd odysrangepnemthxdnamthrrm Abstract method khlasrupthrrm Concrete class sbkhlaskhxngkhlasnamthrrm kahndraylaexiydkhxngaefkthxriemthxdthithukniyaminkhlasaemtwxyangokhdphasacawa twxyangopraekrmkhanwnhaprimatrkhxngrupthrngkrabxksungmisutrdngni primatr phunthithan khwamsung odythi aefkthxriemthxdthahnathisrangrupwngklm primatrkhxngthrngkrabxkkhuxphlkhunkhxngkhwamsungaelaphunthithancakrupwngklmthithuksrangodyaefkthxriemthxd khlasnamthrrm Container niyamaefkthxriemthxd createBase getHeight aela getVolume sungepnethmephltemthxdmiraylaexiydkarkhanwnhaprimatr public abstract class Container Factory method public abstract TwoDShape createBase public abstract double getHeight Template method public double getVolume return createBase getArea getHeight khlasrupthrrm Cylinder srangrupwngklm Circle inaefkthxriemthxd createBase public class Cylinder extends Container private double radius private double height public Cylinder double radius double height this radius radius this height height Override public TwoDShape createBase return new Circle radius Override public double getHeight return height khlas TwoDShape aela Circle public interface TwoDShape public double getArea public class Circle implements TwoDShape private double radius public Circle double radius this radius radius public double getArea return Math PI radius radius xangxingDesign Patterns Elements of Reusable Object Oriented Software ISBN 0 201 63361 2 ody Erich Gamma Richard Helm Ralph Johnson aela John Vlissides Gang of four GoF aehlngkhxmulxunody Vince Huston xngkvs Pattern Summaries Factory Method 2007 08 24 thi ewyaebkaemchchin ody Mark Grand xngkvs The Factory Method Creational Design Pattern ody Gopalan Suresh Raj xngkvs Factory Method Pattern lingkesiy ody OOSE Student ithy