提供了比工厂模式更高一级的接口级,用于返回若个工厂之一。这个模式是属于创建模式之一。有几点值得注意:
对象的创建充分重用重要的代码。
对象的创建需要访问某个信息或者资源时,这对象不应该包含在组合类中。
一般对象生命周期管理必须集中化,确保应用程序中行为的一致性。
分析一个例子,如下:
定义一个枚举类型的CarType类,列出车的类型。
[java]
public enum CarType {
SMALL, SEDAN, LUXURY
}
public enum CarType {
SMALL, SEDAN, LUXURY
}
抽象Car类,所有的子类扩展Car这个类实现自己的特有功能。
[java]
public abstract class Car {
private CarType model = null;
public Car(CarType model) {
this.model = model;
arrangeParts();
}
private void arrangeParts() {
// Do one time processing here
}
// Do subclass level processing in this method
protected abstract void construct();
public CarType getModel() {
return model;
}
public void setModel(CarType model) {
this.model = model;
}
}
public abstract class Car {
private CarType model = null;
public Car(CarType model) {
this.model = model;
arrangeParts();
}
private void arrangeParts() {
// Do one time processing here
}
// Do subclass level processing in this method
protected abstract void construct();
public CarType getModel() {
return model;
}
public void setModel(CarType model) {
this.model = model;
}
}
分别定义SmallCar、Sedan和Luxury类。
[java]
public class SmallCar extends Car{
SmallCar() {
super(CarType.SMALL);
construct();
}
@Override
protected void construct() {
System.out.println("Building small car");
// add accessories
}
}
public class SmallCar extends Car{
SmallCar() {
super(CarType.SMALL);
construct();
}
@Override
protected void construct() {
System.out.println("Building small car");
// add accessories
}
}
[java]
public class SedanCar extends Car {
SedanCar() {
super(CarType.SEDAN);
construct();
}
@Override
protected void construct() {
System.out.println("Building sedan car");
// add accessories
}
}
public class SedanCar extends Car {
SedanCar() {
super(CarType.SEDAN);
construct();
}
@Override
protected void construct() {
System.out.println("Building sedan car");
// add accessories
}
}
[java]
public class LuxuryCar extends Car {
LuxuryCar() {
super(CarType.LUXURY);
construct();
}
@Override
protected void construct() {
System.out.println("Building luxury car");
// add accessories
}
}
public class LuxuryCar extends Car {
LuxuryCar() {
super(CarType.LUXURY);
construct();
}
@Override
protected void construct() {
System.out.println("Building luxury car");
// add accessories
}
}
定义FactoryCar工厂类,现实具体的调用。
[java]
public class CarFactory {
public static Car buildCar(CarType model) {
Car car = null;
switch (model) {
case SMALL:
car = new SmallCar();
break;
case SEDAN:
car = new SedanCar();
break;
case LUXURY:
car = new LuxuryCar();
break;
default:
// throw some exception
break;
}
return car;
}
}
public class CarFactory {
public static Car buildCar(CarType model) {
Car car = null;
switch (model) {
case SMALL:
car = new SmallCar();
break;
case SEDAN:
car = new SedanCar();
break;
case LUXURY:
car = new LuxuryCar();
break;
default:
// throw some exception
break;
}
return car;
}
}
测试工厂类,单元测试如下:
[java]
public class CarFactoryTest {
@SuppressWarnings("deprecation")
@Test
public void testCarFactory() {
Assert.assertEquals(true, CarFactory.buildCar(CarType.SMALL) instanceof Car) ;
Assert.assertEquals(true, CarFactory.buildCar(CarType.SEDAN) instanceof Car) ;
Assert.assertEquals(true, CarFactory.buildCar(CarType.LUXURY) instanceof Car) ;
}
}
public class CarFactoryTest {
@SuppressWarnings("deprecation")
@Test
public void testCarFactory() {
Assert.assertEquals(true, CarFactory.buildCar(CarType.SMALL) instanceof Car) ;
Assert.assertEquals(true, CarFactory.buildCar(CarType.SEDAN) instanceof Car) ;
Assert.assertEquals(true, CarFactory.buildCar(CarType.LUXURY) instanceof Car) ;
}
}
输出结果如下:
[java]
Building small car
Building sedan car
Building luxury car
Building small car
Building sedan car
Building luxury car
工厂模式的使用场合:
1.创建相关的家族或是依赖对象,比如Kit.
2. 提供一个产品类库,显露接口,但是不包括实现。
3. 修要从超类哪里隔离具体的实现类.
4. 系统需要独立出系统的产品如何创建、组合和呈现。
如果你想做一深入的研究,可以查阅Java API代码.
java.sql.DriverManager#getConnection()
java.net.URL#openConnection()
java.lang.Class#newInstance()
java.lang.Class#forName()