关于Factory Method Pattern工厂方法模式——软件构造

1.什么是工厂方法模式(Factory Method Pattern)
工厂方法模式也被称为“虚拟构造器”(Virtual Constructor)。

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。当客户端不知道或者是不确定要创建哪个具体类的实例,又或者不想在客户端代码中指明要具体创建的实例时,用工厂方法。

定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。使用工厂模式会给你系统带来更大的可扩展性和尽量少的修改量。

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生成具体的产品对象,这样做的目的是将产品类的实例操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类

2.举例说明工厂方法模式
先创建一个交通工具接口

public interface Vehicle {
	void travel();
}

然后建立具体的实现类

public class Car implements Vehicle {
	@Override
	public void travel() {
		System.out.println("乘坐汽车出行");
	}
}
public class Plane implements Vehicle {
	 @Override
	 public void travel() {
 		 System.out.println("乘坐飞机出行");
	 }
}
public class Train implements Vehicle {
	 @Override
	 public void travel() {
		  System.out.println("乘坐火车出行");
	 }
}

然后建立工厂方法

public class VehicleFactory {

	public Vehicle createVehicle(String type) {
		if(type == null){
			return null;
		}
		if(type.equalsIgnoreCase("Car")) {
			return new Car();
		} else if (type.equalsIgnoreCase("Plane")) {
			return new Plane();
		} else if (type.equalsIgnoreCase("Train")) {
			return new Train();
		} else {
			return null;
		}
	}
}

在客户端中使用该工厂方法

public class Client {
	public static void main(String[] args) {
		VehicleFactory vehicleFactory = new VehicleFactory();
		
		Vehicle car = vehicleFactory.createVehicle("Car");
		car.travel();
		
		Vehicle plane = vehicleFactory.createVehicle("Plane");
		plane.travel();

		Vehicle train = vehicleFactory.createVehicle("Train");
		train.travel();
	}
}

3.工厂方法的优势与问题
优势
–无需将特定于应用程序的类绑定到代码。
–代码只处理产品接口,因此它可以处理任何用户定义的具体产品

相比于通过构造器(new)构建对象:
–静态工厂方法可具有指定的名称
–不必在每次调用的时候都创建新对象
–可以返回原返回类型的任意子类型

潜在的问题
–客户可能需要创建Creator的一个子类,以便创建特定的具体产品。(每增加一种产品就需要增加一个新的工厂子类)
–如果客户端必须将Creator子类化,这是可以接受的,但如果不是这样,则客户端必须处理另一个演化点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值