设计模式学习(一) 简单工厂模式


这是个人学习编程模式的系列学习笔记第一篇。
采用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;
}

执行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值