一、简单工厂模式
1.1 描述 简单工厂模式是由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例。
1.2 使用场景 工厂类负责创建的对象比较少,客户只需要传入工厂类参数,对于如何创建对象(逻辑)不关心。简单工厂模式很容易违反高内聚低耦合的原则,因此一般只在很简单的情况下使用。
1.3 优点 最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的逻辑动态实例化相关的类。
#include <iostream>
using namespace std;
//定义一个基类
class INoodles
{
public:
virtual void desc() = 0;
};
//派生类1
class LzNoodles :public INoodles
{
public:
void desc()
{
cout << "兰州拉面" << endl;
}
};
//派生类2
class paoNoodles :public INoodles
{
public:
void desc()
{
cout << "泡面" << endl;
}
};
//派生类3
class GanKouNoodles :public INoodles
{
public:
void desc()
{
cout << "干扣面" << endl;
}
};
//工厂类
class SimpleFactory
{
public:
void createNoodles(int type)
{
switch (type)
{
case 1:
{
LzNoodles *demo = new LzNoodles;
demo->desc();
break;
}
case 2:
{
paoNoodles *demo1 = new paoNoodles;
demo1->desc();
break;
}
case 3:
{
GanKouNoodles *demo2 = new GanKouNoodles;
demo2->desc();
break;
}
}
}
};
//主函数
int main()
{
SimpleFactory *demo = new SimpleFactory;
demo->createNoodles(2);
system("Pause");
return 0;
}
特点
1 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。
2 create()方法通常是静态的,所以也称之为静态工厂。
缺点
1 扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)
2 不同的产品需要不同额外参数的时候 不支持。
二、工厂方法模式
1.模式描述
提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。
2.模式作用
可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。
可以一定程度增加扩展性,若增加一个产品实现,只需要实现产品接口,修改工厂创建产品的方法,消费者可以无感知(若消费者不关心具体产品是什么的情况)。
可以一定程度增加代码的封装性、可读性。清楚的代码结构,对于消费者来说很少的代码量就可以完成很多工作。
等等。//TODO
另外,抽象工厂才是实际意义的工厂模式,工厂方法只是抽象工厂的一个比较常见的情况。
3.适用场景
消费者不关心它所要创建对象的类(产品类)的时候。
消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候。
等等。//TODO
例如:hibernate里通过sessionFactory创建session、通过代理方式生成ws客户端时,通过工厂构建报文中格式化数据的对象。