这是个人学习编程模式的系列学习笔记第一篇。
采用Qt Creator进行编写,但尽量采用C++基础语法。
严格来说,简单工厂模式并不是23中设计模式中的一种。但学习简单工厂模式,对了解其他工厂方法,抽象工厂有帮助。
场景描述
假设有一个制作点心的工厂,可以生产各种蛋糕、饼干、面包等点心。要设计一套系统,可以实现自动拌料,自动烘焙。这个场景比较适合采用简单工厂模式。
设计思路
蛋糕、饼干、面包所用原料类似,制作工艺类似,可抽象一个点心类作为基类。
基类实现备料功能(这里假定需要的原料都是面粉、水、糖、酵母),按输入进行备料混合,然后烘焙。各种糕点具体的制作方法不同,根据不同的制作工艺进行烘焙。在基类实现一个获取烘焙方法的纯虚函数作为烘焙方法,在子类实现具体的烘焙方法。
定义一个工厂类,用于根据用户的选择,创建不同的生产线生产具体种类的糕点。
代码
基类——Dessert
Dessert.h
class Dessert
{
public:
Dessert();
void getMaterial(int flour, int water, int sugar, int yeast);
void bake();
virtual char* getBakeMethod() = 0;
protected:
int flour = 0;
int water = 0;
int sugar = 0;
int yeast = 0;
};
Dessert.cpp
#include "dessert.h"
#include <iostream>
using namespace std;
Dessert::Dessert()
{
}
void Dessert::getMaterial(int flour, int water, int sugar, int yeast)
{
this->flour = flour;
this->water = water;
this->sugar = sugar;
this->yeast = yeast;
}
void Dessert::bake()
{
cout<<"Mix material: ";
cout<<this->flour<<"g flour,";
cout<<this->water<<"g water,";
cout<<this->sugar<<"g sugar,";
cout<<this->yeast<<"g yeast\n";
cout<<"Baking "<<this->getBakeMethod()<<"\n";
cout<<"Done \n";
}
子类——Biscuit
Biscuit.h
#include <dessert.h>
class Biscuit : public Dessert
{
public:
Biscuit();
char* getBakeMethod();
};
Biscuit.cpp
Biscuit::Biscuit()
{
}
char* Biscuit::getBakeMethod()
{
return "Biscuit";
}
子类——Bread
Bread.h
#include <dessert.h>
class Bread : public Dessert
{
public:
Bread();
char* getBakeMethod();
};
Bread.cpp
#include "bread.h"
Bread::Bread()
{
}
char *Bread::getBakeMethod()
{
return "Bread";
}
子类——Cake
Cake.h
#include <dessert.h>
class Cake : public Dessert
{
public:
Cake();
char* getBakeMethod();
};
Cake.cpp
#include "cake.h"
Cake::Cake()
{
}
char *Cake::getBakeMethod()
{
return "Cake";
}
工厂类——Factory
Factory.h
#include <dessert.h>
class Factory
{
private:
Dessert* dessert;
public:
Factory();
~Factory();
Dessert* creatBakingKind(int kind);
};
Factory.cpp
#include "factory.h"
#include "biscuit.h"
#include "bread.h"
#include "cake.h"
Factory::Factory()
{
}
Dessert *Factory::creatBakingKind(int kind)
{
switch (kind) {
case 1:
this->dessert = new Biscuit();
break;
case 2:
this->dessert = new Bread();
case 3:
this->dessert = new Cake();
default:
break;
}
return this->dessert;
}
Factory::~Factory()
{
delete this->dessert;
}
界面
main.cpp
#include <dessert.h>
#include <biscuit.h>
#include <cake.h>
#include <factory.h>
using namespace std;
int main(int argc, char *argv[])
{
int chooseKind = 0;
Factory* factory = new Factory();
int flour, water, sugar, yeast;
cout<<"Please choose the kind of dessert: \n";
cout<<"1 biscuit\n";
cout<<"2 bread\n";
cout<<"3 cake\n";
cin>>chooseKind;
Dessert* dessert = factory->creatBakingKind(chooseKind);
cout<<"Please prepare material: \n";
cout<<"Flour:";
cin>>flour;
cout<<"Water:";
cin>>water;
cout<<"Sugar:";
cin>>sugar;
cout<<"Yeast:";
cin>>yeast;
dessert->getMaterial(flour, water, sugar, yeast);
dessert->getBakeMethod();
dessert->bake();
delete factory;
return 0;
}