目录
1 设计模式概述
作用:
面向对象系统的分析和设计实际上在追求两点:高内聚(Cohesion)和低耦合(Coupling)。因此,无论是封装、继承、多态还是设计模式都是为了这两个目标在努力。
设计模式体现的是一种思想,而思想是指导行为的一切,设计模式可以指导程序员设计和开发。
设计模式分类:
2 工厂模式
两个最重要的功能:
1)定义创建对象的接口,封装对象的创建;
2)使得具体化类的工作延迟到子类中。
应用:买车,不需要知道车是怎么造出来的、要哪个产品工厂给哪个产品,不需要知道产品怎么制造。
#include<stdio.h>
#include<iostream>
using namespace std;
class Product{
public:
virtual void Do()=0; //纯虚函数
virtual ~Product() //虚析构
{
cout<<"Product is destructed!"<<endl;
}
};
class ProductA:public Product{ //公有继承,每个子类中都有Do成员方法
public:
void Do(){
cout<<"正在制造ProductA!"<<endl;
}
};
class ProductB:public Product{ //公有继承
public:
void Do(){
cout<<"正在制造ProductB!"<<endl;
}
};
class ProductC:public Product{ //公有继承
public:
void Do(){
cout<<"正在制造ProductC!"<<endl;
}
};
class Factory{ //工厂类
private:
Product *product; //私有的工厂类指针
public:
Factory(int n) //Factory有参构造
{
switch(n){ //switch-case语句确定构造哪个产品对象
case1: product=new ProductA();
break;
case2: product=new ProductB();
break;
case3: product=new ProductC();
break;
}
}
void send() //调用Do函数
{
product->Do();
}
~Factory(){ //析构
delete product;
}
};
int main()
{
Factory *factory=new Factory(2);
factory->send();
return 0;
}
代码说明:示例代码给出的是Factory模式解决父类不知道具体实例化哪一个具体子类的问题,让其子类实现工厂接口,返回的也是一个抽象的产品。
将Factory的有参构造中的switch-case语句变为Product类指针。
#include<stdio.h>
#include<iostream>
using namespace std;
class Product{
public:
virtual void Do()=0;
virtual ~Product(){
cout<<"Product is destructed!"<<endl;
}
};
class ProductA:public Product{
public:
void Do(){
cout<<"正在制造ProductA!"<<endl;
}
};
class ProductB:public Product{
public:
void Do(){
cout<<"正在制造ProductB!"<<endl;
}
};
class ProductC:public Product{
public:
void Do(){
cout<<"正在制造ProductC!"<<endl;
}
};
class Factory{
private:
Product *product;
public:
Factory(Product *t){
product=t;
}
void send()
{
product->Do();
}
~Factory(){
delete product;
}
};
int main(void)
{
Factory *factory=new Factory(new ProductB());
factory->send();
return 0;
}
增加多个Factory和Product类:
#include<stdio.h>
#include<iostream>
using namespace std;
class Product{
public:
virtual void Do()=0;
virtual ~Product(){
cout<<"Product is destructed!"<<endl;
}
};
class ProductA:public Product{
public:
void Do(){
cout<<"正在制造ProductA!"<<endl;
}
};
class ProductB:public Product{
public:
void Do(){
cout<<"正在制造ProductB!"<<endl;
}
};
class ProductC:public Product{
public:
void Do(){
cout<<"正在制造ProductC!"<<endl;
}
};
class Factory{
protected:
Product *product;
public:
virtual void send()=0;
virtual ~Factory(){}
};
class FactoryA: public Factory{
public:
FactoryA(Product *t)
{
product=t;
}
void send()
{
product->Do();
}
};
class FactoryB: public Factory{
public:
FactoryB(Product *t)
{
product=t;
}
void send()
{
product->Do();
}
};
class FactoryC: public Factory{
public:
FactoryC(Product *t)
{
product=t;
}
void send()
{
product->Do();
}
};
int main(void)
{
Factory *factory=new Factory(new PruductA());
factory->send();
return 0;
}
工厂模式的优点: 1)面向接口编程,体现了面向对象的思想;
2)将创建对象的工作转移到了工厂类。
3 单例模式
目的:创建唯一一个对象实例。
通过维护一个static的成员变量来记录这个唯一的对象实例,通过提供一个static的接口instance来获得这个唯一的实例。
举例:一个国家的主席、一个班的班主任等。