• 简单工厂模式


    开了一个新的专栏,把设计模式再重新捡起来的,包括好多没学过的设计模式,都过一遍,巩固已知的,学习未知的!

    先说说设计模式的好处吧

    就是发挥了面向对象编程的三大特性:封装继承多态,把程序耦合性降低,使用设计模式让程序更加的灵活、已扩展修改和复用

    从最最最最基本的简单工厂模式开始吧

    工厂模式:就是要啥生产啥,生产零件的地方。零件又相当于一个个对象,其实就是批量生产对象

    比如要实现一个加减乘除四则运算,平常拿到这么个需求就想着,这个简单,不就一个Switch语句就搞定了吗?

    啊那在main里面写个Switch,case中做加减乘除操作,然后返回结果(经常就这样了)

    1. #include
    2. using namespace std;
    3. int main(int argv[]) {
    4. double numA = 1.0;
    5. double numB = 4.0;
    6. char opertorChar;
    7. cin>>opertorChar;
    8. double result = 0;
    9. switch (opertorChar)
    10. {
    11. case '+':
    12. result = numA + numB;
    13. break;
    14. case '-':
    15. result = numA - numB;
    16. break;
    17. case '*':
    18. result = numA * numB;
    19. break;
    20. case '/':
    21. result = numA / numB;
    22. break;
    23. default:
    24. break;
    25. }
    26. cout << result << endl;
    27. }

    据书上说这就是典型的面向过程编程,如果再加一个求平方、取余,就又需要去更改Switch语句,要是一不小心改了原有代码,那不是惨了,而且因为新增是在原Switch进行修改,原来的逻辑又得测试一遍,增加成本,还不好维护

    通过面向对象来做,就会方便很多,首先抽象一个运算类出来,加减乘除就继承这个运算类

    1. #include
    2. using namespace std;
    3. // 运算类基类
    4. class Operation {
    5. public:
    6. virtual void showResult(double numA, double numB) {}
    7. };
    8. // 加减运算子类
    9. class OperateAdd : public Operation {
    10. public:
    11. void showResult(double numA, double numB) {
    12. cout << "add result: " << numA + numB << endl;
    13. }
    14. };
    15. class OperateSub : public Operation {
    16. public:
    17. void showResult(double numA, double numB) {
    18. cout << "sub result: " << numA - numB << endl;
    19. }
    20. };
    21. class OperateRide : public Operation {
    22. public:
    23. void showResult(double numA, double numB) {
    24. cout << "sub result: " << numA * numB << endl;
    25. }
    26. };
    27. class OperateDivide : public Operation {
    28. public:
    29. void showResult(double numA, double numB) {
    30. cout << "sub result: " << numA / numB << endl;
    31. }
    32. };

    这就解决了第一个问题,再加一堆的运算,我就再加新的类就好了,也不用去修改原有的类

    但是在mian里面岂不是还要写switch,根据类型实例化不同的运算子类,那不还是有问题吗?这不,简单工厂模式就能解决这个问题

    定义一个运算的工厂类,用一个静态方法来生产运算类的对象

    1. //定义简单工厂类
    2. class SimpleFactory {
    3. public:
    4. static Operation* CreateOperator(char opType) {
    5. Operation* op;
    6. switch (opType)
    7. {
    8. case '+':
    9. op = new OperateAdd();
    10. break;
    11. case '-':
    12. op = new OperateSub();
    13. break;
    14. case '*':
    15. op = new OperateSub();
    16. break;
    17. case '/':
    18. op = new OperateDivide();
    19. break;
    20. default:
    21. break;
    22. }
    23. return op;
    24. }
    25. };

    在mian里面,就只需要调用这一个方法获取对应的运算对象即可

    1. int main(int argv[]) {
    2. Operation* op = SimpleFactory::CreateOperator('+');
    3. op->showResult(2.0, 5.0);
    4. }

    这样就变成了维护工厂类了,而且main里面也把逻辑和显示分离开了,这个运算类和工厂类以后不是放哪都能用吗,像原来都写在main中,其他地方要用,又得CV过去,一改全改,折磨人简直。

    这里面就用到了面向对象的三大特性了

    当然不是所有的设计模式都完美无缺的,需求的变更都是要成本的,但是成本高低还是有区别的

  • 相关阅读:
    【数据结构】二叉树链式存储及遍历
    基于Springboot+MySQL的个人健康监控管理系统
    分布式存储系统之Ceph集群部署
    0006__js库中文版
    设备树的理解与运用
    threejs全景图片展示
    VictoriaMetrics之vmagent
    专栏文章列表
    DDR3 的相关设计规范(个人总结)
    Netty之DefaultAttributeMap与AttributeKey的机制和原理
  • 原文地址:https://blog.csdn.net/dl15600383645/article/details/127847915