Abstract factory pattern (2009-03-20)
การสร้าง Abstract Factory จะต้องประกอบด้วยคุณสมบัติต่อไปนี้ก็คือ
ในระดับ Abstract Factory (Abstract Class)
-
Abstract Factory เป็นตัวตัดสินใจว่าจะสร้าง Factory Object ใดขึ้นมาผ่าน Static Method ของ Abstract Factory (static method สามารถเรียกผ่าน Abstract Factory ได้)
-
ในการเลือกว่าจะสร้าง Factory Object ใดขึ้นมาเราอาจใช้การอ่าน Configuration File หรือว่ากำหนดเองโดยผู้ใช้ หรืออาจจะตรวจดูสภาวะแวดล้อมของระบบ
-
เมื่อสร้าง Factory Object แล้วจะใช้การ return ออกมาเป็น Pointer หรือ Object ID ของ Factory Object นั้นโดย type จะเป็นชนิด Abstract Factory นั้นๆ
-
ในการเรียกใช้เพื่อให้การเรียกใช้ไม่ขึ้นต่อความแตกต่างของ Factory Object ต่างๆ ที่ถูกสร้างขึ้นมาจะอนุญาตให้ผู้ใช้เรียกผ่านส่วนที่เป็น Abstract Interface เท่านั้น
ในระดับ Factory Object (Concrete Class)
-
ชนิดของ Object ที่สร้างมาจะตัดสินใจที่ตัว Factory เอง
-
Object ที่ Factory สร้างจะต้องเป็น Object ที่ Derive มาจาก Abstract Class ที่ผู้ใช้งานสามารถเรียกใช้ได้
-
เมื่อ Factory Object สร้าง Object ภายใน Factory Object จะ type ที่ return จะต้อง return ออกมาเป็น Abstract Class แม่ของ Object นั้น
-
เช่นเดียวกับ Factory Object ที่ต้องเรียกผ่าน Abstract Interface ในการเรียก Object ที่สร้างโดย Factory ก็ต้องเรียกผ่านส่วนที่เป็น Abstract Interface ของ Object นั้นด้วย
ข้อได้เปรียบ
เพราะว่า Abstract Factory Design Pattern ได้ใช้ประโยชน์ของ Information Hiding ทำให้ผู้ใช้ไม่ต้องสนใจเรื่องเลือก Factory Class ที่เหมาะสมด้วยตนเอง สิ่งที่ทำก็เพียงแค่เรียกใช้งานผ่าน Abstract Interface แล้ว Object ที่เหมาะสมก็จะถูกสร้างให้โดยอัตโนมัติ เพิ่มความสามารถในการ Reuse เนื่องจาก Factory Class เป็น Concrete Class ที่ Derive มาจาก Abstract Factory Class ซึ่งในการเรียกใช้เราสามารถเรียกผ่าน Abstract Factory ได้ทันทีทำให้เมื่อเราต้องการที่จะเพิ่ม Factory ใหม่ลงไปสามารถทำได้โดยการสร้างคลาสใหม่ที่ Derive มาจาก Abstract Factory Class แล้ว Implement ใหม่ ซึ่งจะไม่ส่งผลต่อการเรียกใช้ของผู้ใช้ที่เรียกผ่าน Abstract Factory Class
ข้อเสียเปรียบ
เช่นเดียวกันกับ Design Pattern อื่นๆ Abstract Factory Design Pattern มีรูปแบบการออกแบบที่ค่อนข้างซับซ้อน อาจเป็นการเพิ่มความซับซ้อนโดยไม่จำเป็น เป็นการเพิ่มความสะดวกในการ design แต่เพิ่มความซับซ้อนในการทำงานของคอมพิวเตอร์ทำให้ Abstract Factory Design Pattern ไม่เหมาะสำหรับงานที่ต้องการความเร็วสูงๆในคอมพิวเตอร์ที่ทรัพยากรค่อนข้าง จำกัด และการออกแบบ Abstract Factory Design Pattern จะต้องทำงานเพิ่มในขั้นตอนแรกๆ ของการ Design ด้วย
อ้างอิงจาก http://th.wikipedia.org/wiki/Abstract_factory_pattern
ตัวอย่าง Code
<?php
abstract class MotorFactory
{
public static function GetMotorFactory($motorType)
{
switch($motorType)
{
case 'car' : return new Car();
break;
case 'motorcycle' : return new Motorcycle();
break;
default : return NULL;
}
}
abstract public function CreateMotor();
}
class CarFactory extends MotorFactory {
public function CreateMotor()
{
return new Car();
}
}
class MotocycleFactory extends MotorFactory {
public function CreateMotor()
{
return new Motocycle();
}
}
abstract Class Motor
{
abstract public function GetInformation();
}
class Car extends Motor
{
public function Car()
{
$this->motorName = "Car";
$this->whell = 4;
$this->toUse = 'Drive';
}
public function getInformation()
{
echo "I am ".$this->motorName;
echo "<br>I have ".$this->whell." whell(s).";
echo "<br>Use me by ".$this->toUse;
echo "<br>Enjoy to ".$this->toUse." me.<hr>";
}
}
class Motorcycle extends Motor
{
public function Motorcycle()
{
$this->motorName = "Motorcycle";
$this->whell = 2;
$this->toUse = 'Ride';
}
public function getInformation()
{
echo "I am ".$this->motorName;
echo "<br>I have ".$this->whell." whell(s).";
echo "<br>Use me by ".$this->toUse;
echo "<br>Enjoy to ".$this->toUse." me.";
echo "<br>Becareful to use me !!!!!! ";
echo "<br>Can u see i am different form Car !!!!!! <hr>";
}
}
$myMotor = MotorFactory::GetMotorFactory('car');
$myMotor->getInformation();
$myMotor2 = MotorFactory::GetMotorFactory('motorcycle');
$myMotor2->getInformation();
?>
ผลลัพธ์ที่ได้
I am Car
I have 4 whell(s).
Use me by Drive
Enjoy to Drive me.
I am Motorcycle
I have 2 whell(s).
Use me by Ride
Enjoy to Ride me.
Becareful to use me !!!!!!
Can u see i am different form Car !!!!!!
|