工厂设计模式(Factory Pattern)
![]() | ![]() | |
![]() | 提供了比工厂模式更高一级的接口级,用于返回若个工厂之一。这个模式是属于创建模式之一。有几点值得注意:
对象的创建充分重用重要的代码。 对象的创建需要访问某个信息或者资源时,这对象不应该包含在组合类中。 一般对象生命周期管理必须集中化,确保应用程序中行为的一致性。 分析一个例子,如下: 定义一个枚举类型的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() | |
![]() | ![]() |