1、设计模式分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
2、设计模式的六大设计原则
单一职责原则:类的设计尽量做到只有一个原因可以引起它的改变
里氏替换原则:只要父类出现的地方子类就可以出现,且替换成子类也不会出现任何错误或者异常
依赖倒置原则:针对接口编程,而不是针对实现编程
接口隔离原则:不要建立臃肿庞大的接口。即接口尽量细化,同时接口中的方法尽量少
迪米特法则: 一个对象应该对其他对象有最少的了解,也就是说一个类要对自己需要耦合或者调用的类知道的最少
开闭原则: 一个软件实体,比如类,模块,函数应该对扩展开放,对修改关闭
3、工厂模式
3.1、简单工厂模式:
它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类(增加判断分支),违背了封闭开放原则。
enum CTYPE {A, B};
//基类:水果
class Fruit
{
public:
virtual void Show() = 0;
};
//橘子子类
class Orange: public Fruit
{
public:
void Show() { cout<<"this is orange"<<endl; }
};
//苹果子类
class Apple: public Fruit
{
public:
void Show() { cout<<"this is apple"<<endl; }
};
//生成水果的工厂,可以生产两种不同的水果,想生成哪种水果在工厂内部判断
class Factory
{
public:
Fruit* CreateFruit(enum CTYPE ctype)
{
if(ctype == A)
return new Orange();
else if(ctype == B)
return new Apple();
else
return NULL;
}
};
3.2、工厂方法模式:
把简单工厂模式的判断都生成一个工厂子类,这样的话每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则(扩展而不修改)。
//基类:水果
class Fruit
{
public:
virtual void Show() = 0;
};
//橘子子类
class Orange: public Fruit
{
public:
void Show() { cout<<"this is orange"<<endl; }
};
//苹果子类
class Apple: public Fruit
{
public:
void Show() { cout<<"this is apple"<<endl; }
};
class Factory
{
public:
virtual Fruit* CreateFruit() = 0;
};
//生产橘子的工厂
class FactoryA: public Factory
{
public:
Fruit* CreateFruit() { return new Orange; }
};
//生产苹果的工厂
class FactoryB: public Factory
{
public:
Fruit* CreateFruit() { return new Apple; }
};
3.3、抽象工厂模式:
工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。
//基类:水果
class Fruit
{
public:
virtual void Show() = 0;
};
//橘子子类
class Orange: public Fruit
{
public:
void Show() { cout<<"this is orange"<<endl; }
};
//苹果子类
class Apple: public Fruit
{
public:
void Show() { cout<<"this is apple"<<endl; }
};
//基类:蔬菜
class Vegetalbles
{
public:
virtual void Show() = 0;
};
//番茄子类
class Tomato : public Vegetalbles
{
public:
void Show() { cout<<"this is tomato"<<endl; }
};
//土豆子类
class Potato : public Vegetalbles
{
public:
void Show() { cout<<"this is potato"<<endl; }
};
//基类:工厂
class BaseFactory
{
public:
virtual Fruit* CreateFruit() = 0;
virtual Vegetalbles* CreateVegetables() = 0;
};
//生产橘子和番茄的工厂
class FactoryA :public BaseFactory
{
public:
Fruit* CreateFruit() { return new Orange(); }
Vegetalbles* CreateVegetables() { return new Tomato(); }
};
//生产苹果和土豆的工厂
class FactoryB : public BaseFactory
{
public:
Fruit* CreateFruit() { return new Apple(); }
Vegetalbles* CreateVegetables() { return new Potato(); }
};