工厂方法模式

一,工厂方法模式

1.1,对工厂方法模式的理解

工厂方法模式: 定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

1.2,解决的问题

解决实例化对象的问题。

1.3,应用场景

接着前面的计算器程序,如果想往前面的计算器程序里面添加乘法运算,使用简单工厂模式实现的话,就要定义一个乘法类,同时要对工厂进行修改,增加一个case判断语句,这就对原有的类进行了修改,违反了开闭原则。使用工厂模式解决这个问题,对应的结构框图与源代码如下:

工厂方法模式_第1张图片

工厂方法模式_第2张图片

// 工厂接口
class Factory
{
public:
	Operation *createOpeartion();
};

// 加法工厂类
class AddOperationFactory : public Factory
{
public:
	Operation *createOpeartion()
	{
		return new AddOperation();
	}
};

// 减法工厂类
class SubOperationFactory : public Factory
{
public:
	Operation *createOpeartion()
	{
		return new SubOperation();
	}
};

// 乘法工厂类
class MultiOperationFactory : public Factory
{
public:
	Operation *createOpeartion()
	{
		return new MultiOperation();
	}
};

// 客户端代码
void main()
{
	Factory *factory = new MultiOperationFactory();
	Operation *operation = factory->createOperation();
}

程序分析:

此时如果要增加一个除法类,只用定义一个除法类实现Operation接口,并定义一个工厂类DiviOperationFactory来创建除法类对象。使用除法的时间只用把Factory *factory = new MultiOperationFactory();修改成Factory *factory = new DiviOperationFactory();即可。

1.4,工厂方法与简单工厂方法的比较

相同点:

  1. 两者都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低了客户端程序与产品对象的耦合。

不同点:

  1. 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算符类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂方法的内部逻辑判断移到了客户端代码来进行。要想添加功能本来是要修改工厂类的,现在变成修改客户端。
  2. 工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点。工厂方法是简单工厂方法的进一步抽象与推广。工厂方法的缺点是,由于每增加一个产品,就要增加一个产品工厂类,增加了额外的开发量。

你可能感兴趣的:(大话设计模式)