
Makefile
Code
| TARGET = factory |
| CC=g++ |
| DIR = $(shell pwd) |
| DIR_OBJ = $(DIR)/obj |
| DIR_SRC = $(DIR)/src |
| DIR_INC = $(DIR)/inc |
| SRC = $(wildcard $(DIR_SRC) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
build.sh
Code
main
Code
C++版本
简单工厂
simplefactory.cpp
Code
| #include |
| #include "SimpleShoes.h" |
| using namespace std; |
| |
| void main_simple_factory(void) |
| { |
| Factory factory; |
| ShoesBase * pNK = factory.creatShoes(NK); |
| pNK->show(); |
| ShoesBase * pLN = factory.creatShoes(LN); |
| pLN->show(); |
| delete pNK; |
| delete pLN; |
| } |
simpleshoes.h
Code
| #ifndef __SIMPLESHOES_H__ |
| #define __SIMPLESHOES_H__ |
| using namespace std; |
| enum PRODUCTTYPE {NK, LN}; |
| |
| class ShoesBase |
| { |
| public: |
| virtual void show() = 0; |
| virtual ~ShoesBase() {}; |
| }; |
| |
| class NikeShoes:public ShoesBase |
| { |
| public: |
| void show() { cout << "Nike shoes" << endl; } |
| }; |
| |
| class LiNingShoes:public ShoesBase |
| { |
| public: |
| void show() { cout << "LiNingShoes shoes" << endl; } |
| }; |
| |
| class Factory |
| { |
| public: |
| ShoesBase * creatShoes(PRODUCTTYPE type) |
| { |
| switch (type) |
| { |
| case NK: |
| cout << "new NK shoes" << endl; |
| return new NikeShoes(); |
| break; |
| case LN: |
| cout << "new LN shoes" << endl; |
| return new LiNingShoes(); |
| break; |
| default: |
| break; |
| } |
| } |
| }; |
| |
| void main_simple_factory(void); |
| #endif |
普通工厂
factory.cpp
Code
| #include |
| #include "Shoes.h" |
| |
| void main_factory(void) |
| { |
| NBLFactory factory1; |
| NBLShoes * pShoes1 = factory1.creatShoes(); |
| pShoes1->show(); |
| HXEKFactory factory2; |
| HXEKShoes * pShoes2 = factory2.creatShoes(); |
| pShoes2->show(); |
| delete pShoes2; |
| delete pShoes1; |
| } |
shoes.h
Code
| #ifndef __SHOES_H__ |
| #define __SHOES_H__ |
| using namespace std; |
| enum TYPE |
| { |
| NBL, |
| HXEK |
| }; |
| |
| class BaseShoes_F |
| { |
| public: |
| virtual void show() = 0; |
| virtual ~BaseShoes_F() {}; |
| }; |
| |
| class NBLShoes:public BaseShoes_F |
| { |
| public: |
| void show() |
| { |
| cout << "NBLShoes shoes" << endl; |
| } |
| }; |
| class HXEKShoes:public BaseShoes_F |
| { |
| public: |
| void show() |
| { |
| cout << "HXEKShoes shoes" << endl; |
| } |
| }; |
| |
| class BaseFactory_F |
| { |
| public: |
| virtual BaseShoes_F * creatShoes() = 0; |
| virtual ~BaseFactory_F() {}; |
| }; |
| |
| class NBLFactory:public BaseFactory_F |
| { |
| public: |
| NBLShoes * creatShoes() |
| { |
| cout << "NBLFactory make shoes" << endl; |
| return new NBLShoes(); |
| } |
| }; |
| class HXEKFactory:public BaseFactory_F |
| { |
| public: |
| HXEKShoes * creatShoes() |
| { |
| cout << "HXEKFactory make shoes" << endl; |
| return new HXEKShoes(); |
| } |
| }; |
| |
| void main_factory(void); |
| #endif |
抽象工厂
abstractfactory.cpp
Code
| #include |
| #include "AbstractShoes.h" |
| |
| void main_abstract_factory(void) |
| { |
| AAA_Factory factory1; |
| BBB_Factory factory2; |
| AbstractBaseShoes * pShoes1 = NULL; |
| AbstractBaseTooth * pThooth1 = NULL; |
| pShoes1 = factory1.creatShoes(); |
| pThooth1 = factory1.creatTooth(); |
| AbstractBaseShoes * pShoes2 = NULL; |
| AbstractBaseTooth * pThooth2 = NULL; |
| pShoes2 = factory2.creatShoes(); |
| pThooth2 = factory2.creatTooth(); |
| delete pShoes1; |
| delete pShoes2; |
| delete pThooth1; |
| delete pThooth2; |
| } |
abstractshoes.h
Code
| #ifndef __ABSTRACTSHOES_H__ |
| #define __ABSTRACTSHOES_H__ |
| using namespace std; |
| enum SHOES_TYPE |
| { |
| AAA_SHOES_TYPE, |
| BBB_SHOES_TYPE |
| }; |
| enum TOOTH_TYPE |
| { |
| AAA_TOOTH_TYPE, |
| BBB_TOOTH_TYPE |
| }; |
| |
| class AbstractBaseShoes |
| { |
| public: |
| virtual ~AbstractBaseShoes() {}; |
| virtual void show() = 0; |
| }; |
| class AAA_Shoes:public AbstractBaseShoes |
| { |
| public: |
| void show() |
| { |
| cout << "AAA_Shoes show" << endl; |
| } |
| }; |
| class BBB_Shoes:public AbstractBaseShoes |
| { |
| public: |
| void show() |
| { |
| cout << "BBB_Shoes show" << endl; |
| } |
| }; |
| |
| class AbstractBaseTooth |
| { |
| public: |
| virtual ~AbstractBaseTooth() {}; |
| virtual void show() = 0; |
| }; |
| class AAA_Tooth:public AbstractBaseTooth |
| { |
| public: |
| void show() |
| { |
| cout << "AAA_Tooth show" << endl; |
| } |
| }; |
| class BBB_Tooth:public AbstractBaseTooth |
| { |
| public: |
| void show() |
| { |
| cout << "BBB_Tooth show" << endl; |
| } |
| }; |
| |
| class AbstractBassFactory |
| { |
| public: |
| virtual AbstractBaseShoes * creatShoes() = 0; |
| virtual AbstractBaseTooth * creatTooth() = 0; |
| }; |
| class AAA_Factory:public AbstractBassFactory |
| { |
| public: |
| AbstractBaseShoes * creatShoes() |
| { |
| cout << "AAA_Factory make Shoes" << endl; |
| return new AAA_Shoes(); |
| } |
| AbstractBaseTooth * creatTooth() |
| { |
| cout << "AAA_Factory make Tooth" << endl; |
| return new AAA_Tooth(); |
| } |
| }; |
| class BBB_Factory:public AbstractBassFactory |
| { |
| public: |
| AbstractBaseShoes * creatShoes() |
| { |
| cout << "BBB_Factory make Shoes" << endl; |
| return new BBB_Shoes(); |
| } |
| AbstractBaseTooth * creatTooth() |
| { |
| cout << "BBB_Factory make Tooth" << endl; |
| return new BBB_Tooth(); |
| } |
| }; |
| |
| void main_abstract_factory(void); |
| #endif |
打印运行结果

参考链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)