[C++]单例模式应用

单例模式的应用

单例模式:

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

class CSingleton
{
private:
    CSingleton() //构造函数是私有的
    {
    }
public:
    static CSingleton * GetInstance()
    {
        static CSingleton *m_pInstance;
        if(m_pInstance == NULL) //判断是否第一次调用
            m_pInstance = new CSingleton();
        return m_pInstance;
    }
};

具体应用:

测试文件:
#include "JobManager.h"
using namespace std;

int main() {
    JobManager *manager1 = JobManager::getInstance();
    JobManager *manager2 = JobManager::getInstance();
    int pris[5] = {234, 23, 23432, 1, 5};
    for (int i = 0; i < 5; i++) {
        manager1->addJob(pris[i]);
    }
    manager2->printJob();
    cout << "The number of job is: " << manager1->getNumOfJob() << endl;
    manager1->finishOneJob();
    cout << "The number of job is: " << manager1->getNumOfJob() << endl;
    manager2->finishOneJob();
    cout << "The number of job is: " << manager1->getNumOfJob() << endl;
    manager1->addJob();
    manager1->addJob(6666);
    manager1->printJob();
    cout << "The number of job is: " << manager1->getNumOfJob() << endl;
    manager2->clear();
    manager1->printJob();
    cout << "The number of job is: " << manager1->getNumOfJob() << endl;

    int jobNum, jobPriority, deleteNum;
    cin >> jobNum;
    for (int i = 0; i < jobNum; i++) {
        cin >> jobPriority;
        manager2->addJob(jobPriority);
    }
    manager1->sortJob();
    manager2->printJob();
    cin >> deleteNum;
    while (deleteNum--) {
        manager1->finishOneJob();
    }
    manager1->printJob();
    cout << "The number of job is: " << manager2->getNumOfJob() << endl;

    if (JobManager::deleteInstance()) cout << "Delete successfully!\n";
    else cout << "Delete failure!\n";

    if (JobManager::deleteInstance()) cout << "Delete successfully!\n";
    else cout << "Delete failure!\n";
}

实现文件1:

此处是把job用list实现。

/*
 * declaration for class Job..
 */
#ifndef JOB_H

#include<string>
using namespace std;

class Job {
public:
    explicit Job(int priority = 0);
    void setId(int id);
    int getId() const;
    void setPriority(int priority);
    int getPriority() const;
    void setNext(Job *job);
    Job *getNext() const;
    string toString();
private:
    static int number;
    int id;
    int priority;
    Job* nextJob;
};

#endif
#include "Job.h"
#include <sstream>
int Job::number = 0;
Job::Job(int _priority) {
    priority = _priority;
    nextJob = NULL;
    id = number;
    number++;
}
void Job::setId(int _id) {
    id = _id;
}
int Job::getId() const {
    return id;
}
void Job::setPriority(int priority_) {
    priority = priority_;
}
int Job::getPriority() const {
    return priority;
}
void Job::setNext(Job *jobs) {
    this->nextJob = jobs;
}
Job* Job::getNext() const {
    if (this->nextJob == NULL) {
        return NULL;
    }
    return nextJob;
}
inline std::string getstring(int onepart) {
    std::stringstream oneparts;
    oneparts << onepart;
    return oneparts.str();
}
std::string Job::toString() {
    // [id:priority]
    std::string answer = "[" + getstring(id) + ":"
        + getstring(priority) + "]";
    return answer;
}
实现文件2:
#ifndef JOBMANAGER_H
#define JOBMANAGER_H

#include <iostream>
#include "Job.h"

// disallow copy constructor and assignment operator
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&);               \
void operator=(const TypeName&)

class JobManager {
public:
    // get the unique instance
    static JobManager* getInstance();
    static bool deleteInstance();

    void addJob(int priority = 0);
    void finishOneJob();
    void sortJob();
    void printJob();
    int getNumOfJob();
    void clear();

private:
    Job * jobFrontPointer;
    ~JobManager();
    JobManager();
    static JobManager* instance;
    DISALLOW_COPY_AND_ASSIGN(JobManager);
};

#endif
#include "JobManager.h"
JobManager* JobManager::getInstance() {
    if (instance == 0) {
        instance = new JobManager();
    }
    return instance;
}
bool JobManager::deleteInstance() {
    if (instance == NULL) {
        return false;
    } else {
        delete instance;
        instance = NULL;
        return true;
    }
}

void JobManager::addJob(int priority) {
    if (getNumOfJob() == 0) {
        jobFrontPointer = new Job(priority);
    } else {
        int i = 1;
        Job* temp = jobFrontPointer;
        while (i != getNumOfJob()) {
            temp = temp->getNext();
            i++;
        }
        Job *anotherOne = new Job(priority);
        temp->setNext(anotherOne);
    }
}

void JobManager::finishOneJob() {
    if (getNumOfJob() == 0) {
        return;
    } else {
        Job* temp = jobFrontPointer;
        jobFrontPointer = jobFrontPointer->getNext();
        delete temp;
    }
}
void JobManager::sortJob() {
    if (jobFrontPointer != NULL && jobFrontPointer->getNext() != NULL) {
        Job* slow = jobFrontPointer;
        Job* fast = jobFrontPointer->getNext();
        while (fast != NULL) {
            if (fast->getPriority() < slow->getPriority()) {
                fast = fast->getNext();
                slow = slow->getNext();
            } else {
                Job* pre = jobFrontPointer;
                if (jobFrontPointer->getPriority() < fast->getPriority()) {
                    slow->setNext(fast->getNext());
                    fast->setNext(jobFrontPointer);
                    jobFrontPointer = fast;
                } else {
                    while (pre->getNext()->getPriority()
                           >= fast->getPriority()) {
                        pre = pre->getNext();
                    }
                    slow->setNext(fast->getNext());
                    fast->setNext(pre->getNext());
                    pre->setNext(fast);
                }
                fast = slow->getNext();
            }
        }
    }
}
void JobManager::printJob() {
    if (getNumOfJob() == 0) {
        cout << "empty!" << endl;
        return;
    }
    cout << jobFrontPointer->toString();
    for (Job* temp = jobFrontPointer->getNext();
         temp != NULL; temp = temp->getNext()) {
        cout << "->" << temp->toString();
    }
    cout << endl;
}
int JobManager::getNumOfJob() {
    int totalNumber = 0;
    Job* temp = jobFrontPointer;
    while (temp != NULL) {
        totalNumber++;
        temp = temp->getNext();
    }
    return totalNumber;
}
void JobManager::clear() {
    Job* temp = jobFrontPointer;
    while (temp != NULL) {
        Job* temp1 = temp;
        temp = temp->getNext();
        temp1->setNext(NULL);
        delete temp1;
    }
    jobFrontPointer = NULL;
}

// private :
JobManager* JobManager::instance = NULL;
JobManager::~JobManager() {
    clear();
}
JobManager::JobManager() {
    jobFrontPointer = NULL;
}

每次做list的时候都要注意最后是否存在memory leak.

sort函数的另一种偷懒做法。

void JobManager::sortJob() {
    // if no or one item in queue, no need to sort it..
    if (jobFrontPointer == NULL || jobFrontPointer->getNext() == NULL) return;

    int nums = getNumOfJob(), i = 0;
    Job *array[nums];
    Job *flagPointer = jobFrontPointer;
    // store each job in array..
    while (flagPointer != NULL) {
        array[i++] = flagPointer;
        flagPointer = flagPointer->getNext();
    }
    // sort each job..
    sort(array, array + nums, cmp);

    array[nums - 1]->setNext(NULL);

    jobFrontPointer = array[0];
    flagPointer = jobFrontPointer;
    for (i = 1; i < nums; i++) {
        flagPointer->setNext(array[i]);
        flagPointer = flagPointer->getNext();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值