建造者模式(C++实现)

(本博客旨在个人总结回顾)

1、详情:

建造者模式:将一个复杂对象与它的表示分离,使得同样的构建过程可以创建不同的表示。

优点: ①建造者独立,易扩展。 ②便于控制细节风险。

缺点: ①产品必须有共同点,范围有限制。 ②如内部变化复杂,会有很多的建造类。

使用场景: ①需要生成的对象具有复杂的内部结构。 ②需要生成的对象内部属性本身相互依赖。

注意事项:与抽象工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

2、应用实例:

快餐店汉堡与饮料组成的套餐,

2.1、UML类图:

 

2.2、代码实现:

Packing.h

#pragma once
#include <string>
using std::string;

class Packing
{
public:
    Packing();
    virtual ~Packing();

public:
    virtual string pack() = 0;
};

Packing.cpp

#include "stdafx.h"
#include "Packing.h"

Packing::Packing()
{
}

Packing::~Packing()
{
}

Wrapper.h

#pragma once
#include "Packing.h"

class Wrapper: public Packing
{
public:
    Wrapper();
    ~Wrapper();

public:
    string pack();
};

Wrapper.cpp

#include "stdafx.h"
#include "Wrapper.h"

Wrapper::Wrapper()
{
}

Wrapper::~Wrapper()
{
}

string Wrapper::pack()
{
    return "Wrapper";
}

Bottle.h

#pragma once
#include "Packing.h"

class Bottle : public Packing
{
public:
    Bottle();
    ~Bottle();

public:
    string pack();
};

Bottle.cpp

#include "stdafx.h"
#include "Bottle.h"

Bottle::Bottle()
{
}

Bottle::~Bottle()
{
}

string Bottle::pack()
{
    return "Bottle";
}

FoodItem.h(抽象产品类)

#pragma once
#include "Packing.h"
#include <string>
using std::string;

class FoodItem
{
public:
    FoodItem();
    virtual ~FoodItem();

public:
    virtual string name() = 0;
    virtual Packing* packing() = 0;
    virtual double price() = 0;
};

FoodItem.cpp

#include "stdafx.h"
#include "FoodItem.h"

FoodItem::FoodItem()
{
}

FoodItem::~FoodItem()
{
}

Burger.h(产品类1)

#pragma once
#include "FoodItem.h"
#include "Wrapper.h"

class Burger :public FoodItem
{
public:
    Burger();
    ~Burger();

public:
    Packing* packing();

private:
    Packing* m_pPacking;
};

Burger.cpp

#include "stdafx.h"
#include "Burger.h"

Burger::Burger()
    : m_pPacking(NULL)
{
}

Burger::~Burger()
{
    if (NULL == m_pPacking)
    {
        delete m_pPacking;
        m_pPacking = NULL;
    }
}

Packing* Burger::packing()
{
    if (NULL == m_pPacking)
    {
        m_pPacking = new Wrapper();
    }

    return m_pPacking;
}

VegBurger.h(具体产品)

#pragma once
#include "Burger.h"

class VegBurger : public Burger
{
public:
    VegBurger();
    virtual ~VegBurger();

public:
    string name();
    double price();
};

VegBurger.cpp

#include "stdafx.h"
#include "VegBurger.h"

VegBurger::VegBurger()
{
}

VegBurger::~VegBurger()
{
}

string VegBurger::name()
{
    return "Veg Burger";
}

double VegBurger::price()
{
    return 23.5f;
}

ChickenBurger.h(具体产品)

#pragma once
#include "Burger.h"

class ChickenBurger : public Burger
{
public:
    ChickenBurger();
    ~ChickenBurger();

public:
    string name();
    double price();
};

ChickenBurger.cpp

#include "stdafx.h"
#include "ChickenBurger.h"

ChickenBurger::ChickenBurger()
{
}

ChickenBurger::~ChickenBurger()
{
}

string ChickenBurger::name()
{
    return "Chicken Burger";
}

double ChickenBurger::price()
{
    return 28.0f;
}

Drink.h(产品类2)

#pragma once
#include "FoodItem.h"
#include "Bottle.h"

class Drink : public FoodItem
{
public:
    Drink();
    ~Drink();

public:
    Packing* packing();

private:
    Packing* m_pPacking;
};

Drink.cpp

#include "stdafx.h"
#include "Drink.h"

Drink::Drink()
    : m_pPacking(NULL)
{
}

Drink::~Drink()
{
    if (NULL == m_pPacking)
    {
        delete m_pPacking;
        m_pPacking = NULL;
    }
}

Packing* Drink::packing()
{
    if (NULL == m_pPacking)
    {
        m_pPacking = new Bottle();
    }

    return m_pPacking;
}

Coke.h(具体产品)

#pragma once
#include "Drink.h"

class Coke :public Drink
{
public:
    Coke();
    ~Coke();

public:
    string name();
    double price();
};

Coke.cpp

#include "stdafx.h"
#include "Coke.h"

Coke::Coke()
{
}

Coke::~Coke()
{
}

string Coke::name()
{
    return "Coke";
}

double Coke::price()
{
    return 8.8f;
}

Pepsi.h(具体产品)

#pragma once
#include "Drink.h"

class Pepsi :public Drink
{
public:
    Pepsi();
    ~Pepsi();

public:
    string name();
    double price();
};

Pepsi.cpp

#include "stdafx.h"
#include "Pepsi.h"

Pepsi::Pepsi()
{
}

Pepsi::~Pepsi()
{
}

string Pepsi::name()
{
    return "Pepsi";
}

double Pepsi::price()
{
    return 7.9f;
}

Meal.h

#pragma once
#include "FoodItem.h"
#include <iostream>
#include <list>
using namespace std;

class Meal
{
public:
    Meal();
    ~Meal();
public:
    void addItem(FoodItem* pFoodItem);
    double getCost();
    void showFoodItems();

private:
    std::list<FoodItem*> m_listFoodItem;
};

Meal.cpp

#include "stdafx.h"
#include "Meal.h"

Meal::Meal()
{
}

Meal::~Meal()
{
    for (std::list<FoodItem*>::iterator it = m_listFoodItem.begin(); it != m_listFoodItem.end(); it++)
    {
        FoodItem* pFoodItem = (*it);
        delete pFoodItem;
    }
}

void Meal::addItem(FoodItem* pFoodItem)
{
    m_listFoodItem.push_back(pFoodItem);
}

double Meal::getCost()
{
    double cost = 0.0f;
    for (std::list<FoodItem*>::iterator it = m_listFoodItem.begin(); it != m_listFoodItem.end(); it++)
    {
        cost += (*it)->price();
    }
    return cost;
}

void Meal::showFoodItems()
{
    cout << "Meal:" << endl;
    for (std::list<FoodItem*>::iterator it = m_listFoodItem.begin(); it != m_listFoodItem.end(); it++)
    {
        cout << "FoodItem:" << (*it)->name() 
        << ",Packing:" << (*it)->packing()->pack() 
        << ",price:" << (*it)->price() << endl;
    }
    cout << "cost:" << getCost() << endl;
}

MealBuilder.h(建造者类)

#pragma once
#include "Meal.h"
#include "VegBurger.h"
#include "ChickenBurger.h"
#include "Coke.h"
#include "Pepsi.h"

class MealBuilder
{
public:
    MealBuilder();
    ~MealBuilder();

public:
    Meal* prepareVegMeal();
    Meal* prepareNovegMeal();
};

MealBuilder.cpp

#include "stdafx.h"
#include "MealBuilder.h"

MealBuilder::MealBuilder()
{
}

MealBuilder::~MealBuilder()
{
}

Meal* MealBuilder::prepareVegMeal()
{
    Meal* pMeal = new Meal();
    pMeal->addItem(new VegBurger());
    pMeal->addItem(new Coke());
    return pMeal;
}

Meal* MealBuilder::prepareNovegMeal()
{
    Meal* pMeal = new Meal();
    pMeal->addItem(new ChickenBurger());
    pMeal->addItem(new Pepsi());
    return pMeal;
}

调用代码:

// BuilderPattern.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "MealBuilder.h"
#include <iostream>
#include <string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    MealBuilder mealBuilder;
    Meal* pMeal = mealBuilder.prepareVegMeal();
    pMeal->showFoodItems();
    delete pMeal;
    pMeal = NULL;

    pMeal = mealBuilder.prepareNovegMeal();
    pMeal->showFoodItems();
    delete pMeal;
    pMeal = NULL;

    system("pause");
	return 0;
}

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值