创建模式之二:工厂方法(Factory Method)
2009-12-27 18:44
525 查看
转自:http://www.lifevv.com/sysdesign/doc/20071106180002526.html
Factory Method模式是一种对象创建型模式,它把类的实例的创建延迟到子类中完成,父工厂类只定义创建对象的公共接口,而子工厂类则负责生成具体的类的实例。
Factory Method模式的概念
在大规模的系统开发过程中,考虑系统的灵活性,低耦合性,可扩展性等因素,常常不直接使用new来生成类的实例,而是通过一个叫做工厂(Factory)的类来专门生成类的实例。Factory Method模式,在上述基础上,把类的实例生成的任务委让给子工厂去完成的一种设计方法,所以Factory Method模式又被称为多态工厂(Polymorphic Factory)模式。在Factory Method模式中,父工厂类只定义创建对象的公共接口,而子工厂类则负责生成具体的类的实例。
简单一点说,Factory Method模式就是生成类实例(对象)的一种方法。
Factory Method用到以下几个概念:
- 父工厂类:定义创建类实例的接口
- 子工厂类:实现接口定义,生成具体的类的实例
- 具有继承关系的产品类:由子工厂类创建
下面举例说明。
有一系列的自动车产品Bus(公交车),Truck(卡车);
它们需要由不同的工厂生产,但具有相同的生产流程。
为了以后扩展其他流水线,比如摩托车,我们需要一种柔软的方案来实现自动车生产的过程。
为了实现这个需求,我们定义了:
CarFactory:定义自动车生产的接口规范。
BusFactory:生产Bus。
TruckFactory:生产Truck。
Car:自动车父类,定义了自动车一些公共的属性与行为。
CarBus:公交车,自动车的一种。
CarTruck:卡车,自动车的一种。
下面我们用Factory Method来实现以上模型。
Factory Method模式的实现范例
工厂类定义:
自动车工厂类CarFactory.java
view plaincopy to clipboardprint?
abstract class CarFactory {
//定义生产自动车生产的接口规范
public Car createCar();
}
生产公交车的工厂类BusFactory.java
view plaincopy to clipboardprint?
class BusFactory extends CarFactory {
public Car createCar() {
//生产公交车
return new CarBus();
}
}
生产卡车的工厂类TruckFactory.java
view plaincopy to clipboardprint?
class TruckFactory extends CarFactory {
public Car createCar() {
//生产卡车
return new TruckBus();
}
}
产品类定义:
自动车父类Car.java
为了简单起见,只定义了一个方法返回自动车的种类。
view plaincopy to clipboardprint?
public class Car {
public String getType() {
return "Car";
}
}
公交车类CarBus.java
view plaincopy to clipboardprint?
public class CarBus extends Car {
public String getType() {
return "Bus";
}
}
卡车类CarTruck.java
view plaincopy to clipboardprint?
public class CarTruck extends Car {
public String getType() {
return "Truck";
}
}
Client调用:通过工厂类生产不同的自动车
Client.java
view plaincopy to clipboardprint?
public class Client {
public static void main(String[] args) {
CarFactory factory = new BusFactory();
//生产公交车
Car bus = factory.createCar();
System.out.println("生产了:" + bus.getType());
factory = new TruckFactory();
//生产卡车
Car truck = factory.createCar();
System.out.println("生产了:" + truck.getType());
}
}
执行Client,输出结果:
C:/FactoryMethod>javac *.java
C:/FactoryMethod>java Client
生产了:Bus
生产了:Truck
C:/FactoryMethod>
我们可以发现,在Client.java里调用时,可以通过共通的父类工厂CarFactory调用同一个createCar()接口方法而取得不同的自动车对象(公交车对象,卡车对象)。
也就是说,可以通过Factory Method模式在不同的子工厂类生成具有统一界面接口的对象,一方面,可以不用关心产品对象的具体实现,简化和统一Client调用过程;另一方面,可以让整个系统具有灵活的可扩展性,如上面的例子中,若要扩展生产摩托车的流水线,只要再实现一个摩托车类以及摩托车工厂类就行,而Client的调用方法完全不需改变。
Factory Method模式是一种对象创建型模式,它把类的实例的创建延迟到子类中完成,父工厂类只定义创建对象的公共接口,而子工厂类则负责生成具体的类的实例。
Factory Method模式的概念
在大规模的系统开发过程中,考虑系统的灵活性,低耦合性,可扩展性等因素,常常不直接使用new来生成类的实例,而是通过一个叫做工厂(Factory)的类来专门生成类的实例。Factory Method模式,在上述基础上,把类的实例生成的任务委让给子工厂去完成的一种设计方法,所以Factory Method模式又被称为多态工厂(Polymorphic Factory)模式。在Factory Method模式中,父工厂类只定义创建对象的公共接口,而子工厂类则负责生成具体的类的实例。
简单一点说,Factory Method模式就是生成类实例(对象)的一种方法。
Factory Method用到以下几个概念:
- 父工厂类:定义创建类实例的接口
- 子工厂类:实现接口定义,生成具体的类的实例
- 具有继承关系的产品类:由子工厂类创建
下面举例说明。
有一系列的自动车产品Bus(公交车),Truck(卡车);
它们需要由不同的工厂生产,但具有相同的生产流程。
为了以后扩展其他流水线,比如摩托车,我们需要一种柔软的方案来实现自动车生产的过程。
为了实现这个需求,我们定义了:
CarFactory:定义自动车生产的接口规范。
BusFactory:生产Bus。
TruckFactory:生产Truck。
Car:自动车父类,定义了自动车一些公共的属性与行为。
CarBus:公交车,自动车的一种。
CarTruck:卡车,自动车的一种。
下面我们用Factory Method来实现以上模型。
Factory Method模式的实现范例
工厂类定义:
自动车工厂类CarFactory.java
view plaincopy to clipboardprint?
abstract class CarFactory {
//定义生产自动车生产的接口规范
public Car createCar();
}
abstract class CarFactory { //定义生产自动车生产的接口规范 public Car createCar(); }
生产公交车的工厂类BusFactory.java
view plaincopy to clipboardprint?
class BusFactory extends CarFactory {
public Car createCar() {
//生产公交车
return new CarBus();
}
}
class BusFactory extends CarFactory { public Car createCar() { //生产公交车 return new CarBus(); } }
生产卡车的工厂类TruckFactory.java
view plaincopy to clipboardprint?
class TruckFactory extends CarFactory {
public Car createCar() {
//生产卡车
return new TruckBus();
}
}
class TruckFactory extends CarFactory { public Car createCar() { //生产卡车 return new TruckBus(); } }
产品类定义:
自动车父类Car.java
为了简单起见,只定义了一个方法返回自动车的种类。
view plaincopy to clipboardprint?
public class Car {
public String getType() {
return "Car";
}
}
public class Car { public String getType() { return "Car"; } }
公交车类CarBus.java
view plaincopy to clipboardprint?
public class CarBus extends Car {
public String getType() {
return "Bus";
}
}
public class CarBus extends Car { public String getType() { return "Bus"; } }
卡车类CarTruck.java
view plaincopy to clipboardprint?
public class CarTruck extends Car {
public String getType() {
return "Truck";
}
}
public class CarTruck extends Car { public String getType() { return "Truck"; } }
Client调用:通过工厂类生产不同的自动车
Client.java
view plaincopy to clipboardprint?
public class Client {
public static void main(String[] args) {
CarFactory factory = new BusFactory();
//生产公交车
Car bus = factory.createCar();
System.out.println("生产了:" + bus.getType());
factory = new TruckFactory();
//生产卡车
Car truck = factory.createCar();
System.out.println("生产了:" + truck.getType());
}
}
public class Client { public static void main(String[] args) { CarFactory factory = new BusFactory(); //生产公交车 Car bus = factory.createCar(); System.out.println("生产了:" + bus.getType()); factory = new TruckFactory(); //生产卡车 Car truck = factory.createCar(); System.out.println("生产了:" + truck.getType()); } }
执行Client,输出结果:
C:/FactoryMethod>javac *.java
C:/FactoryMethod>java Client
生产了:Bus
生产了:Truck
C:/FactoryMethod>
我们可以发现,在Client.java里调用时,可以通过共通的父类工厂CarFactory调用同一个createCar()接口方法而取得不同的自动车对象(公交车对象,卡车对象)。
也就是说,可以通过Factory Method模式在不同的子工厂类生成具有统一界面接口的对象,一方面,可以不用关心产品对象的具体实现,简化和统一Client调用过程;另一方面,可以让整个系统具有灵活的可扩展性,如上面的例子中,若要扩展生产摩托车的流水线,只要再实现一个摩托车类以及摩托车工厂类就行,而Client的调用方法完全不需改变。
相关文章推荐
- 创建模式之二:工厂方法(Factory Method) 续2
- Factory Method 工厂方法(创建模式) 笔记
- 创建类模式(一):工厂方法(Factory Method)
- 工厂模式之二 - 工厂方法(Factory Method)
- 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
- 23种设计模式-FactoryMethod(工厂方法)设计模式
- 《设计模式精解》学习笔记(十五)------FactoryMethod(工厂方法)模式
- 创建型模式-工厂方法(factory_method)
- 工厂方法 (Factory Method) 创建型模式
- 【设计模式】创建型模式之工厂方法Factory Method
- 设计模式学习笔记四:工厂方法(Factory Method)
- 设计模式学习之 Factory method (工厂方法)
- 23设计模式之工厂方法(FactoryMethod)
- 工厂方法(Factory Method)模式
- 设计模式(一)----- 工厂方法(FactoryMethod)----(JAVA版)
- 【设计模式基础】创建型模式 - 4 - 工厂方法(Factory Method)
- 工厂方法(Factory Method)模式
- 工厂方法(Factory Method)模式
- C#面向对象设计模式纵横谈 学习笔记5 Factory Method 工厂方法(创建型模式)
- 设计模式(二) 工厂方法(FactoryMethod)