3、创建型模式

1、单列模式
实现常用步骤
(1)构造函数私有化
(2)提供一个全局的静态方法
(3)在类中定义一个静态指针,指向本来的变量的静态变量指针


//懒汉模式
class Singelton
{
public:
    static Singelton* getInstace() 
    {
        if (sl==NULL)
        {
            sl = new Singelton();
        }
        return sl;
    }
    static void freeInstance() 
    {
        if (sl!=NULL)
        {
            delete sl;
            sl = NULL;
            cout << "free" << endl;
        }
    }
private:
    static Singelton * sl;
    Singelton() 
    {
        cout << "构造函数" << endl;
    }
};

 Singelton * Singelton::sl = NULL;

void test01()
{

    Singelton * s1 = Singelton::getInstace();
    Singelton * s2 = Singelton::getInstace();

    if (s2==s1)
    {
        cout << "是同一个对象" << endl;
    }
    else
    {
        cout << "不是同一个对象" << endl;
    }

    Singelton::freeInstance();

    cout << "------------------------------------" << endl;
}

//饿汉模式
class Singelton
{
public:
    static Singelton* getInstace()
    {
        return sl;
    }
    static void freeInstance()
    {
        if (sl != NULL)
        {
            delete sl;
            sl = NULL;
            cout << "free" << endl;
        }
    }
private:
    static Singelton * sl;
    Singelton()
    {
        cout << "构造函数" << endl;
    }
};
// 不管三七二十一 new出来
Singelton * Singelton::sl = new Singelton(); 为啥能在类外访问 : 在类的作用域下能访问类的所有成员
//相当于一个全局变量,在全局区

void test01()
{

    Singelton * s1 = Singelton::getInstace();
    Singelton * s2 = Singelton::getInstace();

    if (s2 == s1)
    {
        cout << "是同一个对象" << endl;
    }
    else
    {
        cout << "不是同一个对象" << endl;
    }

    Singelton::freeInstance();

    cout << "------------------------------------" << endl;
}

多线程下的懒汉模式

解决双重判定 和加锁

static Singleton *Instantialize()
    {
        if(pInstance == NULL)  //double check 
        {   
            cs.Lock(); //只有当pInstance等于null时,才开始使用加锁机制 二次检查
            if(pInstance == NULL)
            {
                pInstance = new Singleton(); 
            }
            cs.Unlock();
        }
        return pInstance;
    }
    static Singleton *pInstance;

简单工厂模式
这里写图片描述


class Maker
{
public:
    virtual void getName() = 0;

};

class MakerSon:public Maker
{
public:
    virtual void getName() {
        cout << "Maker son" << endl;
    }
}; 

class MakerGirl :public Maker
{
public:
    virtual void getName() {
        cout << "Maker girl" << endl;
    }
}; 

//工厂
class Factory
{
public:

    Maker *create(char *s) 
    {
        if (strcmp(s,"son")==0)
        {
            return new MakerSon;
        }
        else if(strcmp(s,"girl")==0)
        {
            return new MakerGirl;
        }else
        return NULL;
    }
};

void test01()
{
    Factory f;
    Maker *m = NULL;
    m=f.create("girl");
    m->getName();
    delete m;
    cout << "------------------------------------" << endl;
}

简单工厂模式不符合高内聚
工厂模式
这里写图片描述


//抽象类
class Maker
{
public:
    virtual void getName() = 0;

};

//具体类
class MakerSon :public Maker
{
public:
    virtual void getName() {
        cout << "Maker son" << endl;
    }
};
//具体类
class MakerGirl :public Maker
{
public:
    virtual void getName() {
        cout << "Maker girl" << endl;
    }
};

//抽象工厂
class AbFactory
{
public:
    virtual Maker* CreateProduct() = 0;

};

//具体工厂
class GirlFactory:public AbFactory
{
public:
    virtual Maker* CreateProduct() 
    {
        return new MakerGirl();
    };

};
//具体工厂
class SonFactory :public AbFactory
{
public:
    virtual Maker* CreateProduct()
    {
        return new MakerSon();
    };

};

void test01()
{
    AbFactory * abfac = NULL;
    Maker * maker = NULL;
    abfac = new SonFactory;
    maker=abfac->CreateProduct();
    maker->getName();


    abfac = new GirlFactory;
    maker = abfac->CreateProduct();
    maker->getName();

    delete abfac;
    delete maker;
    cout << "------------------------------------" << endl;
}

工厂模式 :只能生产一个产品,
抽象工厂模式:可以一下生产一个商品族
这里写图片描述


//抽象类
class Fruit
{
public:
    virtual void sayname() = 0;

};

//抽象工厂
class AbstractFactory
{
public:
    //依赖 fruit
    virtual Fruit * CreateBanana() = 0;
    virtual Fruit * CreateApple() = 0;
};


//北方香蕉
class NorthBanana:public Fruit
{
public:
    virtual void sayname() 
    {
        cout << "我是北方香蕉" << endl;
    }
};

class NorthApple:public Fruit
{
public:
    virtual void sayname()
    {
        cout << "我是北方苹果" << endl;
    }


};

class  SourthBanan:public Fruit
{
public:
    virtual void sayname()
    {
        cout << "我是南方香蕉" << endl;
    }

};

class SourthApple :public Fruit
{
public:
    virtual void sayname()
    {
        cout << "我是南方苹果" << endl;
    }

};


class NorthFacorty :public AbstractFactory
{
public:
    virtual Fruit * CreateBanana() 
    {
        return new NorthBanana;
    }
    virtual Fruit * CreateApple() 
    {
        return new NorthApple;
    }

};


class SourthFacorty:public AbstractFactory
{
public:
    virtual Fruit *CreateBanana() 
    {
        return new SourthBanan;
    }

    virtual Fruit * CreateApple() 
    {
        return new SourthApple;
    }
};



void test01()
{
    AbstractFactory * fact = NULL;
    Fruit * fruit = NULL;

    fact = new SourthFacorty;
    fruit=fact->CreateBanana();
    fruit->sayname();
    fact->CreateApple();
    fruit->sayname();

    cout << "------------------------------------" << endl;
    fact = new NorthFacorty;
    fruit = fact->CreateBanana();
    fruit->sayname();
    fact->CreateApple();
    fruit->sayname();
}

创建者模式
使用场景:一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。
这里写图片描述
1) Builder:为创建产品各个部分,统一抽象接口。
2) ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C。
3) Director:构造一个使用Builder接口的对象。
4) Product:表示被构造的复杂对象。
ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
这里写图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

#define MAX 100

class House
{
public:
    void setDoor(string door) 
    {
        this->m_door = door;
    }

    string getDoor() 
    {
        cout << m_door << endl;
        return this->m_door;
    }
    void setWall(string wall) 
    {
        this->m_wall = wall;
    }
    string getWall() 
    {
        cout << m_wall << endl;
        return this->m_wall;
    }
    void setWindow(string window) 
    {
        this->m_window = window;
    }
    string getWindow() 
    {
        cout << m_window << endl;
        return this->m_window;
    }


private :
    string m_door;
    string m_wall;
    string m_window;
};

//抽象    工厂队
class Builder
{
public:
    virtual void buildWall() = 0;
    virtual void buildWindow() = 0;
    virtual void buildDoor() = 0;
    virtual House * getHouse() = 0;
};

//公寓工厂队
class FlatBuilder:public Builder
{
public:

    FlatBuilder() 
    {
        house = new House;
    }
    virtual void buildWall() 
    {
        house->setWall("flat  wall");
    }
    virtual void buildWindow()
    {
        house->setWindow("flat window");
    }
    virtual void buildDoor()
    {
        house->setDoor("flat door");
    }
    virtual House * getHouse() 
    {
        return house;
    }

private:
    House * house;
};

//设计师
//建筑队  具体干的活


class Director
{
public:
    Director(Builder *build) 
    {
        m_build = build;
    }

    void Construct() 
    {
        m_build->buildDoor();
        m_build->buildWall();
        m_build->buildWindow();
    }

private:
    Builder * m_build;
};


void test01()
{
    House *house = NULL;
    Builder *builder = NULL;
    Director * dir = NULL;

    builder = new FlatBuilder;

    dir = new Director(builder);
    dir->Construct();

    house = builder->getHouse();
    house->getDoor();
    house->getWall();
    house->getWindow();


    cout << "------------------------------------" << endl;
}


int main()
{
    test01();

    system("pause");
    return 0;
}

原型模式
为每一个对象提供一个接口,让一个复杂的对象具有自我复制的功能
一个复杂的对象,具有自我复制的功能 ,统一一套接口
这里写图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

#define MAX 100

class Person
{
public:
    virtual Person *clone() = 0;
    virtual void print() = 0;
};


class MyPerson:public Person
{
public:
    MyPerson() 
    {
        this->age = 0;
        this->name = "";
    };
    MyPerson(int age,string name)
    {
        this->age = age;
        this->name =name;
    };
    virtual Person *clone() 
    {

        MyPerson *tmp = new MyPerson;
        *tmp = *this;//==tmp->name =this->name;   tmp->age=this->age;//给成员指针开辟空间---记得
        return tmp;

    };
    virtual void print() 
    {
        cout <<"age="<< age<<"name="<<name << endl;
    };


private :
    int age;
    string name;
    //char * desc;  浅拷贝问题
};


void test01()
{

    Person *pers = new MyPerson(20,"hhah");
    pers->print();

    Person * cpy=pers->clone();
    cpy->print();

    cout << "------------------------------------" << endl;
}


int main()
{
    test01();



    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值