Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330122
  • 博文数量: 49
  • 博客积分: 653
  • 博客等级: 上士
  • 技术积分: 646
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 22:43
文章分类

全部博文(49)

文章存档

2018年(1)

2017年(4)

2015年(1)

2014年(6)

2013年(8)

2012年(24)

2011年(5)

分类: C/C++

2017-05-18 17:43:42

工厂模式是属于创建模式, 大体可以分为三种,简单的工厂模式, 工厂方法模式, 抽象工厂模式

一:简单工厂模式

点击(此处)折叠或打开

  1. // 简单工厂模式
  2. // 优点, 简单
  3. // 缺点, 当需要增加新的类的时候, 需要修改工厂类, 违反开发封闭的原则, 软件实体(类, 函数, 模块)
  4. // 可以扩展, 最好不要修改, 可以使用factory methond 去优化
  5. #include<iostream>
  6. using namespace std;

  7. enum PTYPE { PRODUCT_A, PRODUCT_B };
  8. class Product {
  9. public:
  10.     virtual ~Product() {};
  11.     virtual void show() = 0;
  12. };

  13. class ProductA : public Product {
  14. public:
  15.     void show() {
  16.         cout << "product a\n";
  17.     }
  18. };

  19. class ProductB : public Product {
  20. public:
  21.     void show() {
  22.         cout << "product b\n";
  23.     }
  24. };

  25. class Factory {
  26. public:
  27.     Product* Create(PTYPE type) {
  28.         if (type == PRODUCT_A) {
  29.             return new ProductA();
  30.         } else if (type == PRODUCT_B) {
  31.             return new ProductB();
  32.         } else {
  33.             return NULL;
  34.         }
  35.     }

  36. };

  37. int main(int argc, char* argv[]) {

  38.     Factory *pF = new Factory();

  39.     Product *pP = pF->Create(PRODUCT_A);
  40.     pP->show();
  41.     delete pF;

  42.     return 0;
  43. }

二:工厂方法模式, 是对简单工厂模式的优化改进, 解决新增产品, 需要修改工厂类的问题
2.1  目的
    主要是定义一个用于创建对象的接口,让子类来决定实例化哪一个类, Factory Method 让一个类的实例化延迟到了子类
2.2 使用场景:
     1 当一个类不知道他必须创建的类的对象的时候
     2 当一个类希望由他的子类来决定他所创建的对象时候

这个模式可以 把实例化延时到子类中决定

简单的代码


点击(此处)折叠或打开

  1. // 简单工厂模式
  2. #include<iostream>
  3. using namespace std;
  4. // 实例化延迟到子类

  5. // 缺点 , 新增产品, 就需要新增工厂, 类比较多, 可以优化-- 抽象工厂模式

  6. enum PTYPE { PRODUCT_A, PRODUCT_B };
  7. class Product {
  8. public:
  9.     virtual ~Product() {};
  10.     virtual void show() = 0;
  11. };

  12. class ProductA : public Product {
  13. public:
  14.     virtual ~ProductA() {};
  15.     void show() {
  16.         cout << "product a\n";
  17.     }
  18. };

  19. class ProductB : public Product {
  20. public:
  21.     void show() {
  22.         cout << "product b\n";
  23.     }
  24. };

  25. class Factory {
  26. public:
  27.     virtual ~Factory() {};
  28.     virtual Product* Create() = 0;
  29. };
  30. class FactoryA : public Factory {
  31. public:
  32.     Product* Create() {
  33.         return new ProductA();
  34.     }
  35. };

  36. class FactoryB : public Factory {
  37. public:
  38.     Product* Create() {
  39.         return new ProductB();
  40.     }
  41. };

  42. int main(int argc, char* argv[]) {

  43.     Factory *pF = new FactoryA();
  44.     Product *pP = pF->Create();
  45.     pP->show();
  46.     delete pF;
  47.     return 0;
  48. }
缺点: 新增一个产品, 就需要增加一个工厂类, 如果产品比较多的话, 那么类就比较多。 

三:抽象工厂模式
    提供一个创建一系列相关或者互相依赖对象的接口, 而无需指定他们具体的类

点击(此处)折叠或打开

  1. // 简单工厂模式
  2. #include<iostream>
  3. using namespace std;
  4. // 实例化延迟到子类

  5. class Product {
  6. public:
  7.     virtual ~Product() {};
  8.     virtual void show() = 0;
  9. };

  10. class ProductA : public Product {
  11. public:
  12.     virtual ~ProductA() {};
  13.     void show() {
  14.         cout << "product a\n";
  15.     }
  16. };

  17. class Car {
  18. public:
  19.     virtual ~Car() {};
  20.     virtual void show() = 0;
  21. };
  22. class Ben : public Car {
  23. public:
  24.     void show() { cout << " Ben car \n"; }
  25. };

  26. class BMW : public Car {
  27. public:
  28.     void show() { cout << " BMW car \n"; }
  29. };

  30. class ProductB : public Product {
  31. public:
  32.     void show() {
  33.         cout << "product b\n";
  34.     }
  35. };

  36. class Factory {
  37. public:
  38.     virtual ~Factory() {};
  39.     virtual Product* Create() = 0;
  40.     virtual Car* CreateCar() = 0;
  41. };
  42. class FactoryA : public Factory {
  43. public:
  44.     Product* Create() {
  45.         return new ProductA();
  46.     }

  47.     Car* CreateCar() {
  48.         return new BMW();
  49.     }
  50. };

  51. class FactoryB : public Factory {
  52. public:
  53.     Product* Create() {
  54.         return new ProductB();
  55.     }
  56.     Car* CreateCar() {
  57.         return new Ben();
  58.     }
  59. };

  60. int main(int argc, char* argv[]) {

  61.     Factory *pF = new FactoryA();
  62.     Product *pP = pF->Create();
  63.     Car *pC = pF->CreateCar();
  64.     pP->show();
  65.     pC->show();
  66.     delete pF;
  67.     return 0;
  68. }


备注
手绘UML图
    

运行环境:
    以上代码运行于linux环境, Makefile如下

点击(此处)折叠或打开

  1. # set CPUS for Linux or FreeBSD
  2. CPUS := $(shell cat /proc/cpuinfo|grep -c processor)
  3. GCC472_PATH=/usr/local/gcc-4.7.2
  4. CXX := env LD_LIBRARY_PATH=$(GCC472_PATH)/lib:/usr/local/mpc/lib $(GCC472_PATH)/bin/g++
  5. CXXFLAGS := -g3 -O2 -fno-strict-aliasing -Wall -Werror -fPIC \
  6. -isystem /usr/local/include \
  7. -isystem /usr/include
  8. LDFLAGS := -pthread \
  9. -L/usr/local/lib64/ \
  10. -L/usr/local/lib/
  11. RTFLAGS := \
  12. -Wl,-rpath=.. \
  13. -Wl,-rpath=/$(GCC472_PATH)/lib64
  14. LIBS := -lpthread
  15. SRC := $(wildcard *.cc)
  16. OBJ := $(patsubst %.cc, %.o, $(SRC))
  17. DEP := $(patsubst %.o, %.d, $(OBJ))
  18. TARGET := main_test
  19. all:
  20. $(MAKE) -j$(CPUS) target
  21. main_test: $(OBJ)
  22. $(CXX) $^ -o $@ $(RTFLAGS) $(LDFLAGS) $(LIBS)
  23. target: $(TARGET)
  24. %.o : %.cc
  25. $(CXX) -c $(CXXFLAGS) $< -o $@
  26. %.d : %.cc
  27. @$(CXX) -MM $< $(CXXFLAGS) | sed 's/$(notdir $*)\.o/$(subst /,\/,$*).o $(subst /,\/,$*).d/g' > $@
  28. clean:
  29. -rm -rf $(OBJ) $(TARGET) *.core $(DEP) *_unittest
  30. test: all
  31. ./main_test
  32. .PHONY: all target clean test









阅读(846) | 评论(1) | 转发(0) |
0

上一篇:vim配置

下一篇:设计模式之-建造者模式

给主人留下些什么吧!~~

king_road2017-05-18 18:07:39

一个具体的工厂通常是一个单例, 以上代码仅仅学习使用