标签:
1 // 简单工厂模式.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include<string> 7 using namespace std; 8 9 //抽象产品 10 class fruit 11 { 12 public: 13 fruit(); 14 virtual ~fruit(); 15 //由于此类是抽象类,没有价格,所以只能将价格显示定义为纯虚函数 16 virtual void show_price()=0; 17 }; 18 fruit::fruit() 19 {} 20 fruit::~fruit() 21 {} 22 23 //具体产品1 24 class apple :public fruit 25 { 26 public : 27 apple(); 28 virtual ~apple(); 29 virtual void show_price(); 30 }; 31 apple::apple() 32 { 33 cout<<"i am an apple"<<endl; 34 } 35 apple::~apple() 36 {} 37 void apple::show_price() 38 { 39 cout<<"my price is 5"<<endl; 40 } 41 42 //具体产品2 43 class orange :public fruit 44 { 45 public : 46 orange(); 47 virtual ~orange(); 48 virtual void show_price(); 49 }; 50 orange::orange() 51 { 52 cout<<"i am an orange"<<endl; 53 } 54 orange::~orange() 55 {} 56 void orange::show_price() 57 { 58 cout<<"my price is 6"<<endl; 59 } 60 //简单工厂 61 //输入要创建实例的编号,创建对应实例,1:apple,2:orange 62 class fruit_samplefactory 63 { 64 public: 65 fruit_samplefactory(); 66 ~fruit_samplefactory(); 67 public: 68 //此处一定要声明为静态成员函数,因为非静态成员,必须首先实例化一个类对象,才能使用 69 static fruit* creat_fruit(int name_num); 70 //fruit* creat_fruit(int name_num); 71 }; 72 fruit_samplefactory::fruit_samplefactory() 73 { 74 75 } 76 fruit_samplefactory::~fruit_samplefactory() 77 { 78 79 } 80 fruit* fruit_samplefactory::creat_fruit(int name_num) 81 { 82 switch(name_num) 83 { 84 case 1: 85 return new apple; 86 break; 87 case 2: 88 return new orange; 89 break; 90 default: 91 cout<<"您输入的类型不存在"<<endl; 92 return NULL; 93 break; 94 } 95 } 96 97 //用户界面 98 int _tmain(int argc, _TCHAR* argv[]) 99 { 100 int num=2; 101 fruit* orange=NULL; 102 orange=fruit_samplefactory::creat_fruit(num); 103 orange->show_price(); 104 delete orange; 105 orange=NULL; 106 return 0; 107 }
注意问题:1、第16行show_price(),由于fruit是抽象产品,没有价格,所以此处一定要用纯虚函数
虚函数是一定要在类中声明并定义的,而纯虚函数可以在类中声明而不定义,而在子类中进行定义
2、由于第102行调用creat_fruit(num);的时候并没有将orange实例化为fruit_samplefactory类,而因为非静态成员,必须首先实例化一个类对象,才能使用。
所以要将69行中creat_fruit(num);声明为静态成员函数static fruit* creat_fruit(int name_num);估计这就是简单工厂模式又叫做静态工厂模型的原因吧。
标签:
原文地址:http://www.cnblogs.com/bewolf/p/4217839.html