灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3880回复:0

工厂设计模式(Factory Pattern)

楼主#
更多 发布于:2013-05-14 10:28

提供了比工厂模式更高一级的接口级,用于返回若个工厂之一。这个模式是属于创建模式之一。有几点值得注意:

 对象的创建充分重用重要的代码。

 对象的创建需要访问某个信息或者资源时,这对象不应该包含在组合类中。

 一般对象生命周期管理必须集中化,确保应用程序中行为的一致性。

       分析一个例子,如下:

     定义一个枚举类型的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()


喜欢0 评分0
游客

返回顶部