前面学习简单工厂模式的时候提到,简单工厂虽然很好用,就一个静态工厂方法就解决了所有产品类实例化的工作。但也正是因为它将所有产品类的创建逻辑都封装到一个静态方法中,如果现在我需要添加一个新的产品类,那么就必须修改简单工厂的这个静态方法;这样的话,就破坏了“开-闭”原则,对修改没有完全的关闭。今天讲的工厂方法模式,正是对简单工厂模式的补充,使用工厂方法模式弥补了简单工厂模块对“开-闭”原则的支持不足的问题。
工厂方法模式在工厂类的基础上,抽象出一个所有工厂类的父类 -- 抽象工厂,然后为每个具体产品都提供一个具体的工厂类,一个具体的工厂类就只负责一类具体产品的创建工作! 这样就将在静态工厂模式方法中大量的创建逻辑利用多态的方式来实现了。如果有新的产品类加入进来,不需要再修改创建原有的逻辑结构,只需在抽象工厂类之下再新建一个新的工厂类,用对新的产品类进行创建工作。
就好比一个制鞋工厂,开始时,这间鞋厂的规模还不大,因此皮鞋,运动鞋,休闲鞋等所用种类的鞋都有一个部门制造完成,但随着规模的不断扩大,鞋子的数量,款式需求越来越多;一个部门根本应付不了。这种情况下,需要将每种类型的鞋都分一个子部门,皮鞋的生产有专门的皮鞋生产部,运动鞋有专门的运动鞋生产部;如果鞋厂现在需要提供凉鞋。那些只需为凉鞋增加一个凉鞋生产部就可以了;完全不会影响到皮鞋和运动鞋的生产过程。这就是工厂方法在实际应用中的一个例子。下面是他的实现代码。
/*
*
* 所有鞋生产部门的抽象类
*
*/
public abstract class AbstractShopFactory(){
public abstract Shop createShop();
}
/*
*
* 皮鞋生产部门
*
*/
public class leatherShoeFactory extends AbstractShopFactory{
@Override
public Shop createShop() {
// TODO Auto-generated method stub
return new leatherShop();
}
}
/*
*
* 运动生产部门
*
*/
public class sportShoeFactory extends AbstractShopFactory{
@Override
public Shop createShop() {
// TODO Auto-generated method stub
return new sportShoe();
}
}
/*
*
* 鞋子的抽象类
*
*/
public abstract class Shoe(){
public abstract void wear();
}
/*
*
* 皮鞋
*
*/
public class leatherShoe extends Shoe{
@Override
public void wear(){
System.out.println("do something...");
}
}
/*
*
* 运动鞋
*
*/
public class sportShoe extends Shoe{
@Override
public void wear(){
System.out.println("do something...");
}
}
public class client{
public static void main(String[] args){
// 创建一个皮鞋生产部门
AbstractShoeFactory lFactory = new leatherShopFactory();
// 生产皮鞋
Shoe leatherShoe = lFactory.createShoe();
// 创建一个运动鞋生产部门
AbstractShoeFactory sFactory = new sportShopFactory();
// 生产运动鞋
Shoe sportShoe = sFactory.createShoe();
}
}