Factory method makes the design more customizable and only a little more complicated. Other design patterns require new classes whereas factory method requires only a new operation.
Factory method is quite similar to the Abstract Factory. In fact every relevant method of Abstract Factory is a Factory Method. Factory methods could be moved out of their classes in subsequent refactoring and evolve in an external Abstract Factory.
The participating actors are the "Product" - the abstraction of the created object, a "concrete product" - an implementation of the product. "Creator" is the base class which declares a default Factory Method and "ConcreteCreator" is a subclass of the creator which overrides the Factory Method to return a Concrete Product.
Lets check some code
PHP : lets check some code similar to those we wrote for Abstract Factory
abstract class AbstractFactoryMethod { abstract function makeBook($param); } class OReillyFactoryMethod extends AbstractFactoryMethod { private $context = "OReilly"; function makeBook($param) { $book = NULL; switch($param) { case "PHP": $book = new OReillyPHPBook; break; case "MySQL": $book = new OReillyMySQLBook; break; default: $book = new OReillyPHPBook; break; } return $book; } } class SAMSFactoryMethod extends AbstractFactoryMethod { private $context = "SAMS"; function makeBook($param) { $book = NULL; switch($param) { case "PHP": $book = new SamsPHPBook; break; case "MySQL": $book = new SamsMySQLBook; break; default: $book = new SamsMySQLBook; break; } return $book; } } abstract class AbstractBook { abstract function getAuthor(); abstract function getTitle(); } class OReillyPHPBook extends AbstractBook { private $author; private $title; function __construct() { $this->author = "Author - OReilly php"; $this->title = "Title - OReilly php"; } function getAuthor() {return $this->author;} function getTitle() {return $this->title;} } class SamsPHPBook extends AbstractBook { private $author; private $title; function __construct() { $this->author = "Author - SAMS php"; $this->title = "Title - SAMS php"; } function getAuthor() {return $this->author;} function getTitle() {return $this->title;} } class OReillyMySQLBook extends AbstractBook { private $author; private $title; function __construct() { $this->author = "Author - OReilly MySQL"; $this->title = "Title - OReilly MySQL"; } function getAuthor() {return $this->author;} function getTitle() {return $this->title;} } class SamsMySQLBook extends AbstractBook { private $author; private $title; function __construct() { $this->author = "Author - SAMS MySQL"; $this->title = "Title - SAMS MySQL"; } function getAuthor() {return $this->author;} function getTitle() {return $this->title;} } function testFactoryMethod($factoryMethodInstance) { $phpBook = $factoryMethodInstance->makeBook("PHP"); echo "php author : ".$phpBook->getAuthor()."\n"; echo "php title : ".$phpBook->getTitle()."\n"; $mysqlBook = $factoryMethodInstance->makeBook("MySQL"); echo "mysql author : ".$mysqlBook->getAuthor()."\n"; echo "mysql title : ".$mysqlBook->getTitle()."\n"; } echo("Begin\n"); echo("Testing OReillyFactoryMethod\n"); $bookMethodInstance = new OReillyFactoryMethod; testFactoryMethod($bookMethodInstance); echo("----\n"); echo("Testing SamsFactoryMethod\n"); $bookMethodInstance = new SamsFactoryMethod; testFactoryMethod($bookMethodInstance); echo("----\n"); Output : Begin Testing OReillyFactoryMethod php author : Author - OReilly php php title : Title - OReilly php mysql author : Author - OReilly MySQL mysql title : Title - OReilly MySQL ---- Testing SamsFactoryMethod php author : Author - SAMS php php title : Title - SAMS php mysql author : Author - SAMS MySQL mysql title : Title - SAMS MySQL ----
And some example in java
abstract class Pizza { public abstract int getPrice(); // count the cents } class HamAndMushroomPizza extends Pizza { public int getPrice() { return 850; } } class DeluxePizza extends Pizza { public int getPrice() { return 1050; } } class HawaiianPizza extends Pizza { public int getPrice() { return 1150; } } class PizzaFactory { public enum PizzaType { HamMushroom, Deluxe, Hawaiian } public static Pizza createPizza(PizzaType pizzaType) { switch (pizzaType) { case HamMushroom: return new HamAndMushroomPizza(); case Deluxe: return new DeluxePizza(); case Hawaiian: return new HawaiianPizza(); } throw new IllegalArgumentException("The pizza type " + pizzaType + " is not recognized."); } } class myPizza { // Create all available pizzas and print their prices public static void main (String args[]) { for (PizzaFactory.PizzaType pizzaType : PizzaFactory.PizzaType.values()) { System.out.println("Price of " + pizzaType + " is " + PizzaFactory.createPizza(pizzaType).getPrice()); } } } Output : $ java myPizza Price of HamMushroom is 850 Price of Deluxe is 1050 Price of Hawaiian is 1150
No comments:
Post a Comment