设计模式-工厂模式(简单工厂)
1. 问题的提出
现实生活中,工厂用来生产产品,有两个关键的角色:产品及工厂。计算机的工厂模式与实际的工厂的特征是相近的,因此工厂模式的关键点就是如何描述好这两个角色之间的关系,分为四种情况。
1) 单一产品系。工厂生产一种类型的产品。小汽车工厂,生产高,中,低3种类型小汽车。
2) 多产品系,特征相同。工厂生产多种类型的产品。表明是小汽车、公共汽车工厂,均有高、中、低3种类型汽车。
3) 多产品系,部分特征相同。小汽车、公共汽车工厂,均有高档、中档两种类型汽车。除此之外,小汽车还有抵挡类型。
4)多产品系,无特征相同。小汽车、公共汽车工厂,小汽车有高档、中档两种类型汽车。公共汽车有抵挡类型。
工厂模式一般分为简单工厂、工厂、抽象工厂3种情况,属于创建型设计模式。上面的工厂生产汽车的几种情况可以分别映射到这几种工厂模式中。
2. 简单工厂
UML图:
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";
public static ICar create(String mark) {
ICar car = null;
if (mark.equals(TOPTYPE)) {
car = new TopCar();
}
if (mark.equals(MIDTYPE)) {
car = new MidCar();
}
if (mark.equals(LOWTYPE)) {
car = new LowCar();
}
return car;
}
}
public class EasyCarTest {
public static void main(String[] args) {
// 从工厂中穿件对象
ICar car = CarSimpleFactory.create("toptype");
}
}
代码分析:
1. 简单工厂功能类编制步骤
- 定制抽象产品接口,如ICar。
- 定制具体产品子类,如类TopCar、MidCar、LowCar。
- 定制工厂类,如CarSimpleFactory。简单工厂的特点:它是一个具体的类,非接口或抽象类,其中有一个重要的create() 方法,利用if...else或switch开关创建所需产品,并返回。
2. 工厂类静态create( )方法的理解
使用工厂的时候,通常不用创建简单工厂类的类事例,没有创建事例的必要。因此可以把简单工厂类实现成一个工具类,直接使用静态方法就可以了。也就是说,简单工厂的方法通常是静态的,所以也被称为静态工厂。如果要防止客户端无谓的创造简单工厂事例,还可以把简单工厂的构造方法私有化。
语义分析
生活中的语义分析是一个优秀的方法,可以方便构建应用程序的框架。例如甲和乙关于工厂和工作的对话。
如果现在又新增一个超高档类型的汽车,在简单工厂模式下,需要做的工作有:
- 增ICar的子类SuperCar;
- 修改工厂类SimpleCarFactory 中的create( )方法,增加 SuperCar对象的判断选择分支。类SuperCar 的增加是必然的,那么能否不修改工厂类就完成所需功能?下面论述的工厂模式。