《C++20设计模式》享元模式

一、前言

《C++20设计模式》书中对于享元模式个人感觉不是太清晰,就跟逗小孩玩似的。

享元模式模式是干什么的?
答 :牺牲性能,换取内存空间的技术。

相关代码可以在这里,如有帮助给个star
AidenYuanDev/design_patterns_in_modern_Cpp_20

二、享元模式

简而言之,把成员变量分为经常变化和不经常变化,不经常变化的用工厂模式生成。

这次打破以往的惯例,写一个复杂点的类!☠️

1、UML类图

享元模式

2、实现

#include <iostream>
#include <vector>
#include <memory>
#include <unordered_map>
using namespace std;
class Tree_Type {
private:
    string name;
    int attack;
    int defense;
public:
    Tree_Type(string name, int attack, int defense) : name(name), attack(attack), defense(defense) {}

    void show(int x, int y) {
        cout << "name -->" << name << endl;
        cout << "x -->" << x << endl;
        cout << "y -->" << y << endl;
        cout << "attack -->" << attack << endl;
        cout << "defense -->" << defense << endl;
    }
};

class Tree {
private:
    int x;
    int y;
    shared_ptr<Tree_Type> tree_type;
public:
    Tree(int x, int y, shared_ptr<Tree_Type> tree_type) :
        x(x), y(y), tree_type(tree_type) {}
    void show() {
        tree_type->show(x, y);
    }
};

class Tree_Factory {
private:
    unordered_map<string, shared_ptr<Tree_Type>> tree_types;
public:
    static shared_ptr<Tree_Factory> get_instance() {
        static shared_ptr<Tree_Factory> tree_factory = make_shared<Tree_Factory>();
        return tree_factory;
    }

    shared_ptr<Tree_Type> get_tree_type(string name, int attack, int  defense) {
        string key = name + to_string(attack) + to_string(defense);
        if (tree_types.find(key) == tree_types.end()) {
            tree_types[key] = make_shared<Tree_Type>(name, attack, defense);
        }
        return tree_types[key];
    }

    
};

class Forest {
private:
    vector<shared_ptr<Tree>> trees;
public:
    Forest* plan_tree(int x, int y, string name, int attack, int defense) {
        shared_ptr<Tree_Factory> tree_factory = Tree_Factory::get_instance();
        shared_ptr<Tree_Type> tree_type = tree_factory->get_tree_type(name, attack, defense);
        shared_ptr<Tree> tree = make_shared<Tree>(x, y, tree_type);
        trees.push_back(tree);
        return this;
    }

    void show() {
        for (auto it : trees) {
            it->show();
            cout << endl;
        }
    }
};

int main(){
    unique_ptr<Forest> forest = make_unique<Forest>();
    forest->plan_tree(1, 5, "魔王", 100, 100)
          ->plan_tree(3, 6, "小弟", 5, 5)
          ->plan_tree(5, 7, "小弟", 5, 5);
    forest->show();
    return 0;
}
  • 27
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值