zoukankan      html  css  js  c++  java
  • 结构型模式 享元模式

    结构型模式 享元模式

    抽象享元角色:
            所有具体享元类的父类,规定一些需要实现的公共接口。
    具体享元角色:
            抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。
    享元工厂角色:
            负责创建和管理享元角色。

    使用场景:
            是以共享的方式,高效的支持大量的细粒度的对象。

    /**
     * 结构型模式 享元模式
     * Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。
     *
     */
    
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <string>
    #include <map>
    
    class Person
    {
    public:
        Person(std::string name, int age, int sex)
        {
            m_name = name;
            m_age = age;
            m_sex = sex;
        }
        std::string getName()
        {
            return m_name;
        }
        int getAge()
        {
            return m_age;
        }
        int getSex()
        {
            return m_sex;
        }
    
    protected:
        //注意: 保护属性变量
        std::string m_name;
        int m_age;
        int m_sex;
    };
    
    class Teacher: public Person
    {
    public:
        Teacher(std::string id, std::string name, int age, int sex): Person(name, age, sex)
        {
            m_id = id;
        }
        std::string getID()
        {
            return m_id;
        }
        void printT()
        {
            std::cout << "id: " << m_id << "	" << "name: " << m_name << "	" << "age: " << m_age << "	" << "sex: " << m_sex  << std::endl;
        }
    private:
        std::string m_id;
    };
    
    class TeacherFactory
    {
    public:
        TeacherFactory()
        {
            m_tpool.clear();
        }
        ~TeacherFactory()
        {
            while (!m_tpool.empty()) // 在工厂中创建老师结点,在工厂中销毁老师结点
            {
                Teacher *temp = nullptr;
                std::map<std::string, Teacher *>::iterator it = m_tpool.begin();
                temp = it->second;
                m_tpool.erase(it);
                delete temp;
            }
        }
        // 通过Teacher的pool,来存放老师结点,在TeacherFactory中创建老师、销毁老师
        Teacher *getTeacher(std::string tid)
        {
            std::string name;
            int age;
            int sex;
    
            Teacher *temp = nullptr;
            std::map<std::string, Teacher *>::iterator it = m_tpool.find(tid);
            if (it == m_tpool.end())
            {
                std::cout << "id为: " << tid << "的老师不存在, 系统为你创建该老师, 请输入以下信息" << std::endl;
                std::cout << "请输入老师的姓名: " << std::endl;
                std::cin >> name;
                std::cout << "请输入老师的年龄: " << std::endl;
                std::cin >> age;
                std::cout << "请输入老师的性别代号(1: 男 2: 女): " << std::endl;
                std::cin >> sex;
                temp = new Teacher(tid, name, age, sex);
                m_tpool.insert(std::pair<std::string, Teacher *>(tid, temp));
            }
            else
            {
                temp = it->second;
            }
            return temp;
        }
    private:
        std::map<std::string, Teacher *> m_tpool;
    };
    
    
    void mytest()
    {
        TeacherFactory *teacherFactory = new TeacherFactory();
        
        Teacher *t1 = teacherFactory->getTeacher("001");
        t1->printT();
    
        Teacher *t2 = teacherFactory->getTeacher("002");
        t1->printT();
    
        Teacher *t3 = teacherFactory->getTeacher("001");
        t1->printT();
    
        delete teacherFactory;
        teacherFactory = nullptr;
    
        return;
    }
    
    
    int main()
    {
        mytest();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    结队项目----第一次作业
    小学四则运算(2.0版本)
    小学算法(四则运算)
    (读书笔记)基于CMMI的软件工程及实训指导------第一章软件工程基础
    数学建模------线性规划
    初出茅庐-----微信好友分析与微信机器人
    初出茅庐----数据库的学习应用
    初出茅庐---程序测试与爬虫
    初出茅庐----体育竞技分析
    Unity使用小剧场—创建的按钮On Click()只有MonoScript怎么办
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7779340.html
Copyright © 2011-2022 走看看