工厂模式
在面向对象的语言中,如何来创建一个对象呢?以Java 为例,是使用关键字new加上构造方法,例如:
这是一种最常见的方式,当需要创建一个Car的对象时,都可以这样来做。如果把这个例子稍加扩展,现在有一家汽车销售公司,它主要销售轿车,运动型汽车,皮卡这三类车。那么怎么来编写这样的代码呢?假设类Car表示轿车,Suv表示运动型汽车,Truck表示皮卡,类AutoShop表示汽车销售公司。代码示例如下:
这样的代码在功能上已经符合要求了,根据销售车辆的类型,创建出不同的车辆的对象,并执行检查和交付等动作。类AutoShop承担了创建交通工具对象的职责,当需要增加一种新的交通工具类型时,必然会改动到sellAuto方法,所以可以把创建交通工具这个职责抽离到一个新的类VehicleFactory中,让VehicleFactory来负责交通工具对象的创建,这样,即使需要增加新的交通工具的类型,也无须对AutoShop这个类做出更改。而且现有的三种交通工具有相同的方法,只是具体的方法实现各有不同,这样可以把交通工具通用的行为定义在接口Vehicle中,类Car,Suv,Truck来实现Vehicle接口,如果这样的实现方式,类AutoShop只需要和接口Vehicle进行交互。类Car,SUV和Truck实现Vehicle接口的类图如下:
如果交通工具的类进行这样的设计,VehicleFactory的设计也变得更加简单,需要定义一个创建Vehicle接口,类图如下:
类VehicleFactory的代码如下:
类AutoShop的代码如下:
类VehicleFactory中的方法createVehicle就是一个工厂方法,交通工具对象的创建被封装在类VehicleFactory中。
在上面的代码中,实现了一个简单的工厂方法。工厂方法的严格定义如下:声明一个创建对象的接口,由这个接口的实现子类来确定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
抽象工厂模式定义:提供一组相关或者有依赖关系的接口,而无须指定他们的具体类。
版权声明: 本文为 InfoQ 作者【Wen Wei】的原创文章。
原文链接:【http://xie.infoq.cn/article/3d962c513874632740ab82cfc】。文章转载请联系作者。
评论