简单工厂模式,又称为静态工厂方法模式,属于创建型模式,但不是 GOF 的23种模式之一,它由一个工厂对象决定创建出哪一种产品类的实例。其实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例,然后统一返回该实例的基类指针,以供程序其它地方统一调用。
1 #include <iostream> 2 3 class Base 4 { 5 public: 6 virtual void show() = 0; 7 }; 8 9 class Children1 : public Base 10 { 11 public: 12 void show() 13 { 14 std::cout<<"Children1"<<std::endl; 15 } 16 }; 17 18 class Children2 : public Base 19 { 20 public: 21 void show() 22 { 23 std::cout<<"Children2"<<std::endl; 24 } 25 }; 26 27 typedef enum _Enum 28 { 29 ONE = 1, 30 TWO = 2, 31 } MyEnum; 32 33 #define CASE(num,classname) case num:obj=new classname();break; 34 class Factory 35 { 36 public: 37 static Base* createObj(MyEnum num) 38 { 39 Base* obj = nullptr; 40 switch(num) 41 { 42 CASE(ONE,Children1) 43 CASE(TWO,Children2) 44 45 default: 46 break; 47 } 48 return obj; 49 } 50 }; 51 52 int main() 53 { 54 Factory::createObj(ONE)->show(); 55 Factory::createObj(TWO)->show(); 56 }
缺点:没有相应的delete操作,需要在使用时,将创建出来的对象赋给一个基类指针,使用完后delete该指针。上面的代码就存在内存泄漏问题。
Makeflie:
1 CXX = g++ 2 CXXFLAGS = -g -gdwarf-2 -Wall -O0 -std=c++0x 3 4 VPATH =. 5 SRC_FILES = $(foreach n, $(VPATH),$(wildcard $(n)/*.cpp)) 6 EXE_FILES = $(basename $(notdir $(SRC_FILES))) 7 8 .PHONY:target 9 target : $(EXE_FILES) 10 11 % : %.cpp 12 $(CXX) $(CXXFLAGS) -o $@ $< 13 14 .PHONY:clean 15 clean: 16 -rm -rf $(EXE_FILES)