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

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

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

    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其子类。

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

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

    上一章:第七章 为别人做嫁衣 --- 代理模式

    下一章:第九章 简历复印 --- 原型模式