Factory Method

工厂方法要解决的问题是:client不知道/不确定要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例。

使用工厂方法解决问题的过程:定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从 而使一个类的实例化延迟到其子类

例如:

如上图所示,Product是用户想要创建的产品,它可能有多种类型,这里举例是两种类型,client创建时不想知道这些类型是什么,

我们创建一个工厂接口,即图中的Creator,并提供一个创建产品的功能接口,返回的产品是抽象接口Product类型的,client只需与该工厂交互即可。Product是一个抽象接口,定义了产品的规范,它的各个实现子类代表产品的各个种类,但是用户不想选择种类,只需要它是产品。因此,在工厂接口中创建产品的返回值类型定义为Product类型

接下来我们对应每一个产品都建立一个具体工厂来实现工厂接口,其中创建产品的功能就是new一个具体产品的实例并返回。这时用户在新建产品时只需指定工厂,调用工厂中的创建功能,就可以得到一个产品,client甚至可以不知道产品的种类是什么。

另外,我们还可以令一个工厂类中自由选择创建多种产品,通过用户输入参数来确定创建哪一个,如:

在习题2中,我们创建了一个ParkingField类来表示停车场,使用Car类来表示停车场里的车,现在,有一个将程序扩展的需求,要不只是表示停车场,还要可以表示机场或者其他的停放场所,我们使用工厂方法来实现这个功能。

public Parkable create(String type, String plate, int width, String[] extraRegistrationInfo) throws Exception {
		if (type.equals("car")) {
			Car c = new Car(plate, width);
			c.registerDriver(extraRegistrationInfo[0]);
			return c;
		} else if (type.equals("motor")) {
			Motor m = new Motor(plate, width);
			m.registerDriver(extraRegistrationInfo[0]);
			return m;
		} else if (type.equals("plane")) {
			Plane p = new Plane(plate, width);
			Calendar c = Calendar.getInstance();
			p.registerAirport(extraRegistrationInfo[0], c);
			return p;
		}
		else
			throw new Exception("Illegal type");
	}

通过创建一个Parkable的接口,接口有三种实现,分别对应着Motor、Car、Plane三种交通工具,通过选则来实现不同的功能,例如,如果要实现一个机场,那么,就可以用Plane来实现Parkable。

这样实现了用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。代码的处理都是针对统一的Product,对用户自定义的任意一种具体产品都可适用。

但是,client需要具体化Creator,每增加一种产品就需要增加一个新的工厂子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值