設計模式之原型模式

在上篇博文中我們學習了有關單例模式,單例模式通俗點講就是隻有一個對象的類,這種設計模式最大的優點就是對象易於管理,這種設計模式是值得好好地學習下的,其他的我們就不多說了,接下來我們再來學習一下另外一個設計模式——原型模式,在列出代碼之前,我們需要了解一下:什麼叫原型模式,原型模式的定義:用原型實例指定創建對象的種類,並且通過使用拷貝這些原型創建新的對象。這句話怎麼來理解呢,其實說白了,就是使用已有的對象來創建新對象,這種模式的使用最大的優點就是一個原型能夠創建出無數個新的對象,其使用價值還是很高的,好了,下面就來看看具體的代碼吧,代碼如下:

#ifndef __PROTOTYPE__H
#define __PROTOTYPE__H

#include <stdio.h>
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;

class Person
{
    public:
        Person(){}
        ~Person(){}
        virtual void setName(string name){}
        virtual void setAge(int age){}
        virtual void display(){}
        virtual shared_ptr<Person> clone()
        {
            return shared_ptr<Person>(this);
        }
};

class Man : public Person
{
    public:
        Man(string name = string(),const int age = 0):name(name),age(age)
        {
        }
        ~Man(){}

        Man(const Man& man)
        {
            name = man.name;
            age = man.age;
        }

        Man& operator = (const Man& man)
        {
            name = man.name;
            age = man.age;
        }

        void display()
        {
            cout<<"name:"<<name<<" "<<"age:"<<age<<" ";
        }
        void setName(string name)
        {
            this->name = name;
        }
        void setAge(const int age)
        {
            this->age = age;
        }
        shared_ptr<Person> clone()
        {
            return shared_ptr<Person>(this);
        }
    private:
        string name;
        int age;
};

class Woman : public Person
{
    public:
        Woman(string name = string(),const int age = 0):name(name),age(age){}
        ~Woman(){}

        Woman(const Woman& woman)
        {
            name = woman.name;
            age = woman.age;
        }
        Woman& operator = (const Woman& woman)
        {
            name = woman.name;
            age = woman.age;
        }

        void display()
        {
            cout<<"name:"<<name<<" "<<"age"<<age<<" ";
        }
        void setName(string name)
        {
            this->name = name;
        }
        void setAge(const int age)
        {
            this->age = age;
        }
        shared_ptr<Person> clone()
        {
            return shared_ptr<Person>(this);
        }
    private:
        string name;
        int age;
};

class Car
{
    public:
        Car(){}
        ~Car(){}
        virtual void run()
        {
        }
        virtual void stop()
        {
        }
        virtual shared_ptr<Car> clone()
        {
            return shared_ptr<Car>(this);
        }
};

class BWMCar : public Car
{
    public:
        BWMCar(){}
        ~BWMCar(){}

        void run()
        {
            cout<<"BWMCar is runnig"<<endl;
        }
        void stop()
        {
            cout<<"BWMCar is stoping"<<endl;
        }
        shared_ptr<Car> clone()
        {
            return shared_ptr<Car>(this);
        }
};
class VolvoCar : public Car
{
    public:
        VolvoCar(){}
        ~VolvoCar(){}

        void run()
        {
            cout<<"VolvoCar is running"<<endl;
        }
        void stop()
        {
            cout<<"VolvoCar is stoping"<<endl;
        }
        shared_ptr<Car> clone()
        {
            return shared_ptr<Car>(this);
        }
};

class Manager
{
    public:
        Manager(shared_ptr<Person>& pson,shared_ptr<Car>& ca)
        {
            person = pson->clone();
            car = ca->clone();
        }
        ~Manager(){}
        void run()
        {
            person->display();
            car->run();
        }
    private:
        shared_ptr<Person> person;
        shared_ptr<Car> car;
};
#endif

測試程序:

#include "ProtoType.h"

int main()
{
    shared_ptr<Person> man(new Man("Tom",31));
    shared_ptr<Person> woman(new Woman("Lily",21));
    shared_ptr<Car> BWM(new BWMCar());
    shared_ptr<Car> Volvo(new VolvoCar());
    Manager manager1(man,BWM);
    Manager manager2(woman,Volvo);
    manager1.run();
    manager2.run();
    return 0;
}

測試結果

name:Tom age:31 BWMCar is runnig
name:Lily age21 VolvoCar is running

總結

      本篇博文簡要地分析了設計模式中的原型模式,這種模型最大的好處用一個比較貼切的比方(也是從別人的博客裏看到的):就好比是一個原稿打印一堆複印稿的關係,當原稿需要修改一個地方時,只需要針對原稿進行修改即可,而不需改動複印稿,然後重新在打印即可。說到這裏,想必大家應該能夠明白原型模式到底是神馬意思了吧,好好地體會一下吧,好了,本篇博文到此結束,下篇博文我們繼續學習設計模式——建造者模式。

如果需要,請註明轉載,多謝

發佈了52 篇原創文章 · 獲贊 10 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章