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;
}