设计模式-C++版本-工厂模式-简单工厂-抽象工厂

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)/*.cpp)
SRC_NO_DIR = $(notdir $(SRC))
SRC_OBJ = $(patsubst %cpp, %o, $(SRC_NO_DIR))
INC = -I$(DIR_INC) \
FLAG = -g
all:$(TARGET)
@echo "======= all make successs ======="
$(TARGET):$(addprefix $(DIR_OBJ)/, $(SRC_OBJ))
$(CC) -o $@ $^ $(INC) $(FLAG)
@echo "======= Linux make successs ======="
$(DIR_OBJ)/%.o:$(DIR_SRC)/%.cpp
@mkdir -p $(DIR_OBJ)
$(CC) -c $< -o $@ $(INC) $(FLAG)
.PHONY:clean
clean:
-rm -rf $(DIR_OBJ)
-rm $(TARGET)
@echo "======= make clean success ======="

build.sh

Code
#!/bin/sh
make clean
make

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

打印运行结果

参考链接

posted @   steve的miao  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示