问题提出

Java的工厂模式与现实生活中的工厂的模型是很相似的。工厂是用来做什么?当然是用来生成产品。因此在Java的工厂模式的关键点就是如何描述好产品和工厂这2个角色之间的关系。

 

下面来仔细描述一下不同的关系以及对应的设计模式

1)单一产品系,工厂只生产一种类型的产品

Java设计模式:工厂模式

让我们简单构思一下简单的工厂生产模型,既然只有一个产品,那只需要一个车间就好了,一个车间分别生产三种不同种类的小汽车。好,下面看看简单工厂的设计模式。

Java设计模式:工厂模式

//定义小汽车接口:ICar.java
public interface ICar {
}
public class TopCar implements ICar {
}
public class MidCar implements ICar {
}
public class LowCar implements ICar {
}
public class CarSimpleFactory {
    public static final String TOPTYPE = "toptype";
    public static final String MIDTYPE = "midtype";
    public static final String LOWTYPE = "lowtype";

    private CarSimpleFactory(){
        
    }
    public static ICar create(String mark){
        ICar obj = null;
        if(mark.equals(TOPTYPE)){
            obj = new TopCar();
        }
        else if(mark.equals(MIDTYPE)){
            obj = new MidCar();
        }
        else if(mark.equals(LOWTYPE)){
            obj = new LowCar();
        }
        return obj;
    }
}

简单工厂功能类编写步骤:

1.编写抽象产品接口

2.编写具体产品子类

3.编写工厂类。简单工厂类的特点,它是一个具体的类,非接口型抽象类。有一个重要的create()方法,并且用if...else或者switch开发创建所需产品。因为可以把这个简单工厂类实现成一个工具类,所以直接用静态方法就可以了,如有必要甚至可以把构造方法私有化。

 

下面考虑一种情形,工厂扩张啦!可以加工生产超级高档型的汽车。在上面的生产模式下要怎么修改呢?

1)新增ICar子类SuperCar

2)修改工厂类SimpleCarFactory中的create()方法,添加判断分支。

子类SuperCar的添加是必然的,然而能不能不用修改工厂类呢?

或者从另一个角度分析,在一个生产线上生产几种不同种类的产品,这样我们还需要对每个产品加以判断种类来分类。当然,假若只有2种种类要区分,这样当然没问题,但是若是有多个种类要区分呢?显然,不能在一条生产线上生产多种种类的产品!那意味着对于每一种种类我们都需要一条生产线。这就是所谓的工厂模式!

Java设计模式:工厂模式

public abstract class AbstractFactory {
    public abstract ICar create();
}

public class LowFactory extends AbstractFactory {
    public ICar create(){
        return new LowCar();
    }
}

View Code