设计模式之简单工厂模式学习
学习C++有一两年了,面向对象思想也有所接触。使用过MFC以及OSG类库进行过开发,无非就是调用别人设计好的类库,要说自己使用面向对象的思想去开发程序,这个还真没有。意识到自己在这方面的匮乏,开始学习设计模式。教材选用《大话设计模式》,每个章节的学习过程分为三部分:第一部分,阅读课本,第二部分:按照书上例子写出C++代码的对应版本。第三部分:博客上的学习笔记。
编程是一门技术,更是一门艺术。应该经常考虑如何使代码更加简练、可扩展、可复用和易维护。这是每个立志于成为合格程序员都应具有的素质。这些东西学校不教,只有通过从大量编程中总结教训获得经验。
通过封装继承多态,把程序的耦合性降低,使程序更加的灵活、容易修改、易于复用。业务逻辑与界面逻辑分开,让他们的耦合度降低,只有这样才能达到可维护和易扩展。
1:可维护:只需改要改之处,此为可维护性
2:可复用:并非仅供一个工程内使用,以后在其他项目时也可以方便的使用。此为可复用。
3:可扩展:若要添加功能,只需在原有基础上添加即可,此为可扩展。
4:灵活性:不拘泥于一种形式。此为灵活性。
大话设计模式在介绍简单工厂模式时介绍了一个计算器的例子,引出了初学者容易犯的几个问题:知道面向对象,但是究竟好在哪里、如何更好地使用它却无从知晓。
学习设计模式四境界:
一:没学之前一点儿都不懂,根本想不到用设计模式,设计的代码很糟糕。
二:学了几个设计模式很开心,于是到处想着用自己学过的设计模式,时常造成误用设计模式而不自知。
三:学完设计模式后,感觉诸多模式极其相似,无法分清模式之间的差异。有困惑,但深知误用之害,应用之时有所犹豫。
四:灵活应用设计模式,甚至不应用某种具体的模式也能写出优秀的代码,已达到无剑胜有剑的境界。
希望自己能早日进入第四个境界,达到无剑胜有剑的境界。
在例子中,加减乘除派生自一个基类,该基类定义了公有的属性以及虚函数接口。在各个派生类中实现了每个派生类中需要的功能。除此之外还定义了简单工厂类,在简单工厂类中,根据运算符决定需要实例化那个运算功能类。
看代码:
-
1.#include<iostream> 2.usingnamespace std; 1.//基类 2.class Calculation 3.{ 4. public: 5. Calculation(double n1,double n2) 6. :num1(n1),num2(n2) 7. { 8. 9. }; 10. Calculation() 11. :num1(0),num2(0) 12. { 13. 14. }; 15. ~Calculation() 16. { 17. 18. } 19. virutal double calculate()=0; 20. double num1; 21. double num2; 22.};
-
1.//加法 1.class AddCalculation:public Calculation 2.{ 3. AddCalculation(double n1,double n2) 4. :Calculation(n1,n2) 5. { 6. 7. } 8. AddCalculation() 9. { 10. 11. } 12. ~AddCalculation() 13. { 14. 15. } 16. virtualdouble calculate() 17. { 18. return num1+num2; 19. } 20. 21. 22.} ; class AddCalculation:public Calculation { AddCalculation(double n1,double n2) :Calculation(n1,n2) { } AddCalculation() { } ~AddCalculation() { } virtual double calculate() { return num1+num2; } } ;
-
1.//减法 1.class Substract:public Calculation 2.{ 3. public: 4. Substract(double n1,double n2) 5. :Calculation(n1,n2) 6. { 7. 8. } 9. Substract() 10. { 11. 12. } 13. ~Substract() 14. { 15. 16. } 17. virtualdouble calculate() 18. { 19. return num1-num2; 20. } 21. 22.} ;
//乘法 1.class Multiply:public:Calculation 2.{ 3.public: 4. Multiply(double n1,doule n2) 5. :Calculaion(n1,n2) 6. { 7. 8. } 9. Multiply() 10. { 11. } 12. ~Multiply() 13. { 14. 15. } 16. virtualdouble calculate() 17. { 18. return num1*num2; 19. } 20. 21.};
-
1.//除法 1.class Divide:public Calculation 2.{ 3. public: 4. Diviede(double n1,double n2) 5. :Calculation(n1,n2) 6. { 7. 8. } 9. Divide() 10. { 11. 12. } 13. ~Divide() 14. { 15. 16. } 17. virtualdouble calculate() 18. { 19. if(num2==0) 20. { 21. 22. } 23. return num1/num2; 24. } 25. 26. 27.};
-
1.//抽象工厂类 1.class OperationFactory 2.{ 3. public: 4. OperationFactory(double n1,char op,double n2) 5. { 6. Operator=op; 7. num1=n1; 8. num2=n2; 9. cal=NULL; 10. } 11. ~OperationFactory() 12. { 13. if(cal) 14. delete cal; 15. } 16. char Operator; 17. Calculation * cal; 18. double result; 19. double n1; 20. double n2; 21. double createCalculation() 22. { 23. switch(Operator) 24. { 25. case'+': 26. { 27. cal=new AddCalculation(n1,n2); 28. } 29. break; 30. case'-': 31. { 32. cal=new Substract(n1,n2); 33. } 34. break; 35. case'*': 36. { 37. cal=new Multiply(n1,n2); 38. } 39. break; 40. case'/': 41. { 42. cal=new Divide(n1,n2); 43. 44. } 45. break; 46. default: 47. break; 48. } 49. result=cal->calculate(); 50. } 51. 52.}; 53.int main(int argc,char**argv) 54.{ 55. double n1,n2; 56. while(cin>>n1>>n2); 57. { 58. 59. OperationFactory opf(n1,'+',n2); 60. cout<<opf.createCalculation()<<endl; 61. 62. } 63. return 0; 64.}
浙公网安备 33010602011771号