在这三种工厂模式下仍有许多缺点,下面这篇博客提供了更为详细的解答:
https://blog.csdn.net/u012156116/article/details/80857255
相关知识:
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。
开放封闭原则:类的改动是通过增加代码进行的,而不是修改源代码。
依赖倒置原则:依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程。
1、简单工厂模式
无需了解创建对象的过程,相当于屏蔽了创建对象的过程,即把这个过程封装在一个Factory类里。
例1:
/*************************************************************************
> File Name: 3_简单工厂模式.cpp
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月07日 星期日 14时19分55秒
************************************************************************/
//创建一个水果的虚基类,然后派生出苹果和香蕉;创建一个工厂,既可以生产苹果,也可以生产香蕉
//但是我们又可以发现,当工厂添加一种新的生产产品时,不能通过添加代码,只能对工厂的代码进行修改,这违背了开放封闭原则
#include<iostream>
using namespace std;
class Fruit //水果虚基类
{
public:
virtual void work() = 0;
};
class Apple:public Fruit //苹果
{
public:
void work()
{
cout<<"this is apple"<<endl;
}
};
class Banana:public Fruit //香蕉
{
public:
void work()
{
cout<<"this is banana"<<endl;
}
};
class Factory
{
public:
Fruit *GetApple() //生产苹果
{
return new Apple;
}
Fruit *GetBanana() //生产香蕉
{
return new Banana;
}
};
int main()
{
Factory *p = new Factory;
Fruit *f = p->GetApple();
f->work();
delete f;
f = p->GetBanana();
f->work();
delete f;
return 0;
}
我们发现简单工厂模式的工厂不满足“高内聚”的特点,即一个类一个功能;想要增加功能,势必要修改工厂里的代码,不符合开放封闭原则。
2、工厂模式
克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。
例2:
/*************************************************************************
> File Name: 4_工厂模式.cpp
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月07日 星期日 14时19分55秒
************************************************************************/
/*在简单工厂的基础之上创建一个工厂的虚基类,然后派生出生产各种产品(这些产品同属于一个类)的工厂;但当我们想让这个工厂生产其他类时,势必要修改工厂,但这样又违背了开放封闭原则*/
#include<iostream>
using namespace std;
class Fruit //水果虚基类
{
public:
virtual void work() = 0;
};
class Apple:public Fruit //苹果
{
public:
void work()
{
cout<<"this is apple"<<endl;
}
};
class Banana:public Fruit //香蕉
{
public:
void work()
{
cout<<"this is banana"<<endl;
}
};
class Factory //工厂虚基类
{
public:
virtual Fruit*work() = 0;
};
class AppleFactory:public Factory //生产苹果的工厂
{
public:
Fruit*work()
{
return new Apple;
}
};
class BananaFactory:public Factory //生产香蕉的工厂
{
Fruit *work()
{
return new Banana;
}
};
int main()
{
Factory *p = new AppleFactory;
Fruit *f = p->work();
f->work();
delete f;
delete p;
p = new BananaFactory;
f = p->work();
f->work();
delete f;
delete p;
return 0;
}
3、抽象工厂模式
为了更接近生活,一个工厂里并不可能只生产一种产品,使用抽象工厂可以实现一个工厂生产多种产品。
它的缺点仍是不能给很好的满足开放封闭原则,因为一个工厂里包含了多种功能。
例3:
/*本例中A、B两个工厂都生产水果和玩具,A工厂生产苹果、猴子玩具
,B工厂生产香蕉、猫玩具*/
/*************************************************************************
> File Name: 5_抽象工厂模式.cpp
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月07日 星期日 14时19分55秒
************************************************************************/
#include<iostream>
using namespace std;
class Fruit
{
public:
virtual void work() = 0;
};
class Apple:public Fruit
{
public:
void work()
{
cout<<"this is apple"<<endl;
}
};
class Banana:public Fruit
{
public:
void work()
{
cout<<"this is banana"<<endl;
}
};
class Toy //玩具虚基类
{
public:
virtual void work() = 0;
};
class Monkey:public Toy //猴子玩具
{
public:
void work()
{
cout<<"this is monkey toy"<<endl;
}
};
class Cat:public Toy //猫玩具
{
public:
void work()
{
cout<<"this is cat toy"<<endl;
}
};
class Factory //虚基类工厂,有两个功能,这也违背了开放封闭原则
{
public:
virtual Fruit*GetFruit() = 0;
virtual Toy*GetToy() = 0;
};
class AFactory:public Factory //A工厂生产苹果、猴子玩具
{
public:
Fruit*GetFruit()
{
return new Apple;
}
Toy*GetToy()
{
return new Monkey;
}
};
class BFactory:public Factory //B工厂生产香蕉、猫玩具
{
Fruit *GetFruit()
{
return new Banana;
}
Toy*GetToy()
{
return new Cat;
}
};
int main()
{
Factory *f = new AFactory;
Fruit *p = f->GetFruit();
Toy *q = f->GetToy();
p->work();
q->work();
delete q;
delete p;
delete f;
f = new BFactory;
p = f->GetFruit();
q = f->GetToy();
p->work();
q->work();
delete q;
delete p;
delete f;
return 0;
}