最近打算总结一下设计模式(希望可以坚持写完...)。
设计模式大体上可以分为三种:
1)创建型(5种)
具体包括:工厂方法(包括简单工厂),抽象工厂,单例,建造者,原型
2)结构型模式(7种)
具体包括:适配器,桥接,组合,装饰器,代理,外观,享元
3)行为型模式(11种)
具体包括:策略模式,模版方法,命令,职责链,状态,观察者,中介者,迭代器,访问者,备忘录,解释器
创建型模式的技巧主要应用于创建对象的方式上。
结构性模式的技巧主要在于对不同类之间的组合以实现代码复用。
行为型模式的技巧在于不同类之间的相互作用及相互影响。
创建型模式
1)简单工厂模式
简单工厂一般只包含一个工厂,以及产品抽象类及其子类。
优点:实现了对象的创建与使用的分离。
缺点: 每增加一个产品都要修改原来的代码,且需要不断增加新的逻辑。

enum fruits{
APPLE,
GRAPE
}
//果汁抽象类
class Juice{
public:
virtual void show() = 0;
}
//果汁具体类,苹果汁
class AppleJuice : public Juice{
public:
void show(){
cout<<"AppleJuice"<<endl;
}
}
//果汁具体类,葡萄汁
class GrapeJuice : public Juice{
public:
void show(){
cout<<"GrapeJuice"<<endl;
}
}
//工厂类
class Factory{
public:
Juice* getJuice(int type){
switch (type){
case APPLE:
return new AppleJuice();
case GRAPE:
return new GrapeJuice();
default:
break;
}
return NULL;
}
}
//主函数的使用
int main()
{
Factory* fac = new Factory();
Juice* applejuice1 = fac.getJuice(APPLE);
Juice* grapejuice1 = fac.getJuice(GRAPE);
delete fac;
delete applejuice1;
delete grapejuice1;
}
2)工厂方法
工厂方法在于为每一种产品建立一个工厂。一个工厂只生产一种产品。
因此需要同时包含产品抽象类和工厂抽象类。
优点:增加新的产品不需要修改原来的代码。

//果汁抽象类
class Juice{
public:
virtual void show() = 0;
}
//果汁具体类,苹果汁
class AppleJuice : public Juice{
public:
void show(){
cout<<"AppleJuice"<<endl;
}
}
//果汁具体类,葡萄汁
class GrapeJuice : public Juice{
public:
void show(){
cout<<"GrapeJuice"<<endl;
}
}
//工厂抽象类
class Factory{
public:
virtual Juice* createJuice() = 0
}
//苹果汁工厂类
class AppleJuiceFactory{
public:
Juice* createJuice(){
return new AppleJuice();
}
}
class GrapeJuiceFactor{
public:
Juice* createJuice(){
return new GrapeJuice();
}
}
int main(){
Factory* fac1 = new AppleJuiceFactory();
Factory* fac2 = new GrapeJuiceFactory();
Juice* applejuice1 = fac1.createJuice();
Juice* grapeJuice1 = fac2.createJuice();
//delete...
}
3)抽象工厂模式
让一个工厂拥有好几条产品线。
优点:方便扩展新的产品系列
缺点:增加新的产品时,需要修改所有工厂

//果汁抽象类
class Juice{
public:
virtual void show() = 0;
}
class Jam{
public:
virtual void show() = 0;
}
//果汁具体类,苹果汁
class AppleJuice : public Juice{
public:
void show(){
cout<<"AppleJuice"<<endl;
}
}
//果汁具体类,葡萄汁
class GrapeJuice : public Juice{
public:
void show(){
cout<<"GrapeJuice"<<endl;
}
}
//果酱具体类,苹果酱
class AppleJam: public Jam{
public:
void show(){
cout<<"AppleJam"<<endl;
}
}
//果酱具体类,葡萄酱
class GrapeJam: public Jam{
public:
void show(){
cout<<"GrapeJam"<<endl;
}
}
//工厂抽象类
class Factory{
public:
virtual Juice* createJuice() = 0;
virtual Jam* createJam() = 0;
}
//工厂具体类,苹果工厂
class AppleFactory{
public:
Juice* createJuice(){
return new AppleJuice();
}
Jam* createJame(){
return new AppleJam();
}
}
//工厂具体类,葡萄工厂
class GrapeFactory{
public:
Juice* createJuice(){
return new GrapeJuice();
}
Jam* createJame(){
return new GrapeJam();
}
}
int main(){
Factory* fac1 = new AppleFactory();
Juice* applejuice1 = fac1.createJuice();
Jam* applejam1 = fac1.createJam();
Factory* fac2 = new GrapeFactory();
Juice* grapeJuice2 = fac2.createJuice();
Jam* grapejam2 = fac2.createJam()''
}