设计模式之单例模式

单例模式是一个很常见的设计模式,也广泛应用于程序开发。其具有如下特点:

  • 一个类只有一个实例化对象

  • 全局可以使用

那不就定义一个类,程序只初始化一个全局的实例就好了吗?没错,这样是可以的。但是程序会经过多人的接手维护和开发,比如第N个接手程序的时候,并不知道这个类定义的时候只能初始化一个实例,然后又实例化了新的对象, 则可能会造成意想不到的场景。那么这时候就要提到防御性编程,单例模式的实现也是防御性编程的一种方式,让这个类保证只有一个实例化对象,并且如果试图构造多个对象的时候,在程序的编译期报错。题外话,这也是有些人在进行一些稍大规模开发的时候,只会去选择强类型语言,而不会选择弱类型语言的原因,强类型语言会在编译期间帮我们避免很多运行时可能产生的的Bug。–来自微信公众号

接下来是来自卡码网的例题
题目描述

小明去了一家大型商场,拿到了一个购物车,并开始购物。请你设计一个购物车管理器,记录商品添加到购物车的信息(商品名称和购买数量),并在购买结束后打印出商品清单。(在整个购物过程中,小明只有一个购物车实例存在)。

输入描述

输入包含若干行,每行包含两部分信息,分别是商品名称和购买数量。商品名称和购买数量之间用空格隔开。

输出描述

输出包含小明购物车中的所有商品及其购买数量。每行输出一种商品的信息,格式为 “商品名称 购买数量”。

输入示例

Apple 3 Banana 2 Orange 5

输出示例

Apple 3 Banana 2 Orange 5

提示信息

本道题目请使用单例设计模式:

使用私有静态变量来保存购物车实例。

使用私有构造函数防止外部直接实例化。

#include 
#include 
#include 
#include 

using namespace std;

class shoppingCart
{
private:
    unordered_map goodsLst;
    vector orderLst;
    
private:
    shoppingCart() {};
    
public:
    ~shoppingCart() {};
    static shoppingCart* GetInstance();
    void showCart();
    void addCart(string gName, int gCnt);
};

shoppingCart* shoppingCart::GetInstance()
{
    static shoppingCart instance;
    return &instance;
}

void shoppingCart::addCart(string gName, int gCnt)
{
    if (gName.empty() || gCnt <= 0)
        return;
    orderLst.push_back(gName);
    goodsLst[gName] += gCnt;
}

void shoppingCart::showCart()
{
    if (!goodsLst.size())
        return;
    for (const auto& name : orderLst)
        cout << name << " " << goodsLst.at(name) << endl;
}

int main(int argc, const char *argv[])
{
    shoppingCart *cart = shoppingCart::GetInstance();
    int cnt;
    string name;
    while (cin >> name >> cnt)
    {
        cart->addCart(name, cnt);
    }
    cart->showCart();
    return 0;
}

你可能感兴趣的:(设计模式,设计模式,单例模式)