- 工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式。
- 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
- 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的借口,这样进一步抽象化的好处是
使得工厂方法模式可以使系统不在修改具体工厂角色的情况下引进新的产品。
模式中包含的角色及职责
- 抽象工厂角色(Creator)角色。工厂方法模式的核心,任何工厂类都必须实现这个接口
- 具体工厂角色(Concrete Creator)角色。具体工厂类是抽象工厂的一个实现,负责实例化产品对象
- 抽象产品(Product)角色。工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- 具体产品(Concreate Creator)角色。工厂方法模式所创建的具体实例对象
代码实例:
仍然是上一篇的水果
/**
* 抽象工厂,任何工厂类都必须实现这个接口
* @author Sweiit
*
*/
public interface FruitsFactory{
Fruits getFruits();
}
/**
* 具体工厂角色,具体生产某一类产品的工厂,必须实现抽象工厂类
* @author Sweiit
*
*/
public class AppleFactory implements FruitsFactory{
@Override
public Fruits getFruits() {
// TODO Auto-generated method stub
return new Apple();
}
}
/**
* 抽象产品角色,它负责描述所有实例所共有的公共接口
* @author Sweiit
*
*/
public interface Fruits {
void get();
}
/**
* 具体产品类
* @author Sweiit
*
*/
public class Apple implements Fruits {
@Override
public void get() {
System.out.println("apple");
}
}
public class Test {
// 测试类
public static void main(String[] args) {
Fruits apple = new AppleFactory().getFruits();
apple.get();
}
}
如果我们再添加一个Banana产品,那么只用添加一个Banana具体对象和一个BananaFactory具体工厂对象,不需要对原来工厂进行修改,产品与产品之间也不会有任何的影响。
工厂方法模式和简单工厂模式比较:
- 工厂方法模式与简单工厂模式在结构上不是很明显,工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
- 工厂方法模式之所以有个别名叫多态方法模式是因为具体工厂类都具有共同的接口,或者共同的抽象父类。
- 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的复合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
- 工厂方法模式退化后可以演变成简单工厂模式。