写点什么

工厂模式

用户头像
Wen Wei
关注
发布于: 2020 年 04 月 29 日

在面向对象的语言中,如何来创建一个对象呢?以Java 为例,是使用关键字new加上构造方法,例如:

Car car = new Car();

这是一种最常见的方式,当需要创建一个Car的对象时,都可以这样来做。如果把这个例子稍加扩展,现在有一家汽车销售公司,它主要销售轿车,运动型汽车,皮卡这三类车。那么怎么来编写这样的代码呢?假设类Car表示轿车,Suv表示运动型汽车,Truck表示皮卡,类AutoShop表示汽车销售公司。代码示例如下:

class AutoShop{
void sellAuto(String type){
if(type.equals("car")){
Car car =new Car();
car.check();
car.deliver();
}else if(type.equals("suv")){
Suv suv=new Suv();
suv.check();
suv.deliver();
}else if(type.eqals("truck")){
Truck truck=new Truck();
truck.check();
truck.deliver();
}
}
}

这样的代码在功能上已经符合要求了,根据销售车辆的类型,创建出不同的车辆的对象,并执行检查和交付等动作。类AutoShop承担了创建交通工具对象的职责,当需要增加一种新的交通工具类型时,必然会改动到sellAuto方法,所以可以把创建交通工具这个职责抽离到一个新的类VehicleFactory中,让VehicleFactory来负责交通工具对象的创建,这样,即使需要增加新的交通工具的类型,也无须对AutoShop这个类做出更改。而且现有的三种交通工具有相同的方法,只是具体的方法实现各有不同,这样可以把交通工具通用的行为定义在接口Vehicle中,类Car,Suv,Truck来实现Vehicle接口,如果这样的实现方式,类AutoShop只需要和接口Vehicle进行交互。类Car,SUV和Truck实现Vehicle接口的类图如下:

image.png



如果交通工具的类进行这样的设计,VehicleFactory的设计也变得更加简单,需要定义一个创建Vehicle接口,类图如下:



image.png



类VehicleFactory的代码如下:

class VehicleFactory{
public Vehicle createVehicle(String type){
Vehicle vehicle;
if(type.equals("car")){
vehicle =new Car();
}else if(type.equals("suv")){
vehicle=new Suv();
}else if(type.eqals("truck")){
vehicle=new Truck();
}
}
}

类AutoShop的代码如下:

class AutoShop{
VehicleFactory factory=new VehicleFactory();
public void sellAuto(String type){
Vehicle vehicle=factory.createVehicle(type);
vehicle.check();
vehicle.deliver();
}
}

类VehicleFactory中的方法createVehicle就是一个工厂方法,交通工具对象的创建被封装在类VehicleFactory中。

在上面的代码中,实现了一个简单的工厂方法。工厂方法的严格定义如下:声明一个创建对象的接口,由这个接口的实现子类来确定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。



image.png



抽象工厂模式定义:提供一组相关或者有依赖关系的接口,而无须指定他们的具体类。



interface AutoAccessoryFactory{
createWheel();
createDoor();
}
class Wheel{}
class Door{}
class TruckWheel extends Wheel{}
class CarWheel extends Wheel{}
class TruckDoor extends Door{}
class CarDoor extends Door{}
class CarAccessoryFactory implements AutoAccessoryFactory{
Wheel createWheel(){
return new CarWheel();
}
Door createDoor(){
return new CarDoor();
}
}
class TruckAccessoryFactory implements AutoAccessoryFactory{
Wheel createWheel(){
return new TruckWheel();
}
Door createDoor(){
return new TruckDoor();
}
}



发布于: 2020 年 04 月 29 日阅读数: 46
用户头像

Wen Wei

关注

还未添加个人签名 2018.06.01 加入

还未添加个人简介

评论

发布
暂无评论
工厂模式