问题:
在学习笔记一中曾提到简单工厂模式的缺点是对"开-闭"原则支持不够, 当系统中有新产品加入时, 必须修改工厂类, 添加必要的逻辑在工厂类中.
为了克服简单工厂模式的缺点, 引入了工厂方法模式. 即增加一个抽象工厂接口, 仅负责给出具体工厂类必须实现的接口, 不负责哪个抽象类被实例化的细节.
工厂方法模式可以使系统在不修改具体工厂类的情况下添加新产品.
类图:
实现源码:
/**
* 抽象工厂接口
* 负责给出具体工厂类必须实现的接口
*/
public interface Factory
{
public Product factory();
}
/**
* 具体工厂类
* 负责创建具体产品类ConcreteProduct1.
*/
public class ConcreteFactory1 implements Factory
{
public Product factory()
{
return new ConcreteProduct1();
}
}
/**
* 具体工厂类
* 负责创建具体产品类ConcreteProduct2.
*/
public class ConcreteFactory2 implements Factory
{
public Product factory()
{
return new ConcreteProduct2();
}
}
/**
* 抽象产品接口
*/
public interface Product
{
}
/**
* 具体产品类ConcreteProduct1
*/
public class ConcreteProduct1 implements Product
{
public ConcreteProduct1()
{
//do something
}
}
/**
* 具体产品类ConcreteProduct2.
*/
public class ConcreteProduct2 implements Product
{
public ConcreteProduct2()
{
//do something
}
}
/**
* 客户端代码.
*/
Factory theConcreteFactory1 = new ConcreteFactory1();
Factory theConcreteFactory2 = new ConcreteFactory2();
Product aConcreteProduct1 = theConcreteFactory1.factory();
Product aConcreteProduct2 = theConcreteFactory2.factory();
注意:
1) 在给类和方法取名时应让人明显看出系统应用了工厂方法模式
2)抽象工厂类可以定义多个工厂方法, 这些方法可以提供不同逻辑, 满足提供不同产品对象的目的.
总结:
对工厂方法模式来说, 添加一个新产品只需向系统中加入一个新产品类以及对应的工厂类即可. 没有必要修改客户端, 也没有必要修改抽象工厂类和系统已有的具体工厂类. 对增加新产品来说, 系统完全支持"开-闭"原则