第八章 工厂方法模式(雷锋依然在人间)

根据第一章,简单工厂模式(加减乘除)是这样的:

  1. class OperationFactory
  2. {
  3. public static function createOperation($operation)
  4. {
  5. switch ($operation) {
  6. case '+':
  7. $oper = new OperationAdd();
  8. break;
  9. case '-':
  10. $oper = new OperationSub();
  11. break;
  12. case '/':
  13. $oper = new OperationDiv();
  14. break;
  15. case '*':
  16. $oper = new OperationMul();
  17. break;
  18. }
  19. return $oper;
  20. }
  21. }
  22. // 客户端代码
  23. $operation = OperationFactory::createOperation('+');
  24. $operation->setA(1);
  25. $operation->setA(2);
  26. echo $operation->getResult()."\n";

换成工厂方法模式

  1. interface IFactory
  2. {
  3. public function CreateOperation();
  4. }
  5. class AddFactory implements IFactory
  6. {
  7. public function CreateOperation()
  8. {
  9. return new OperationAdd();
  10. }
  11. }
  12. class SubFactory implements IFactory
  13. {
  14. public function CreateOperation()
  15. {
  16. return new OperationSub();
  17. }
  18. }
  19. class MulFactory implements IFactory
  20. {
  21. public function CreateOperation()
  22. {
  23. return new OperationMul();
  24. }
  25. }
  26. class DivFactory implements IFactory
  27. {
  28. public function CreateOperation()
  29. {
  30. return new OperationDiv();
  31. }
  32. }
  33. //客户端代码
  34. $operationFactory = new AddFactory();
  35. $operation = $operationFactory->CreateOperation();
  36. $operation->setA(10);
  37. $operation->setB(10);
  38. echo $operation->getResult()."\n";

总结:

工厂方法模式,定义一个创建对象的接口,让子类确定实例化哪一个类。工厂方法使一个类的实例化延迟到7其子类。

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据用户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你 想要加功能,本来是改工厂类的,而现在是修改客户端。