设计模式学习笔记三:工厂方法模式

本文探讨了如何通过改进订单流程,引入工厂模式来细分不同业务线(如国内机票、海外机票等),从而提高系统结构的灵活性和业务处理的效率。通过将订单创建过程延迟到子类中,实现了根据不同产品的类型创建特定订单,使得业务逻辑更加清晰,团队成员可以专注于各自模块的开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇文章讲到了简单工厂模式(Factory method)

本人将按照上篇文章的场景继续讨论,若想了解请移至:http://blog.csdn.net/array7/article/details/38499739。

场景只是为了引申出主题,不具有实际意义,请谅解业务逻辑不完整之处,以后可能会再进行润色,咱只是不希望把一个模式说的没有依据。

    随着公司领导有方与同事努力奋斗,公司的业绩越来越好,不同的业务线有了新的变化,以满足公司的长足发展。

        机票组细分为了国内机票、海外机票;

        酒店组细分了国内酒店、海外酒店;

        门票组细分了景点门票、赛事门票;

        度假组细分了......


    这个时候我们发现,现有的系统需要在业务层面上继续分离,在系统结构上也需要有所变动。也就是说我们要修改系统达到这样一个目的,根据同一个产品的不同类型创建订单,而订单的创建则有是一个具体的工厂的创建。我们还是用原来的订单控制中心,只不过把订单创建延迟到子类中进行。


代码如下:

1、订单中心,现在变成了抽象类,将creteOrder方法移回来并变成抽象方法。

/* 
 * OrderProcessCenter.java 1.0 2014/08/11 
 *  
 * 声明:欢迎转载,请注明出处。 
 *  
 */  

package com.array7.facotry_method;
/**
 * 订单中心,负责对所有类型的订单进行控制
 * @author array7
 *
 */
public abstract class OrderProcessCenter {
	public Order orderFlow(String type) {
//		Order order = new SimpleOrderFactory().createOrder(type);
		Order order = this.createOrder(type);
		order.pay();
		order.notifyCustomer();
		order.finish();
		return order;
	}
	
	public abstract Order createOrder(String type);
}

2、具体的工厂继承上面的订单中心类,实现指定类型的订单工厂:

package com.array7.facotry_method;

public class ChinaOrderProcessCenter extends OrderProcessCenter{

	@Override
	public Order createOrder(String type) {
		Order order = null;
		if ("air".equals(type)) {
			order = new ChinaAirOrder();
		} else if ("hotel".equals(type)) {
			order = new ChinaHotelOrder();
		} else if ("ticket".equals(type)) {
			order = new ChinaTicketOrder();
		} else if ("xxx".equals(type)) {
			// TODO: some thing
		} else if ("yyy".equals(type)) {
			// TODO: some thing
		} else if ("zzz".equals(type)) {
			// TODO: some thing
		} else if ("123".equals(type)) {
			// TODO: some thing
		}
		return order;
	}

}

package com.array7.facotry_method;

public class ForeignOrderProcessCenter extends OrderProcessCenter{

	@Override
	public Order createOrder(String type) {
		Order order = null;
		if ("air".equals(type)) {
			order = new ForeignAirOrder();
		} else if ("hotel".equals(type)) {
			order = new ForeignHotelOrder();
		} else if ("ticket".equals(type)) {
			order = new ForeignTicketOrder();
		} else if ("xxx".equals(type)) {
			// TODO: some thing
		} else if ("yyy".equals(type)) {
			// TODO: some thing
		} else if ("zzz".equals(type)) {
			// TODO: some thing
		} else if ("123".equals(type)) {
			// TODO: some thing
		}
		return order;
	}

}


3、创建具体的订单:

package com.array7.facotry_method;

public class ChinaAirOrder extends Order{
	public ChinaAirOrder() {
		System.out.println("create a ChinaAirOrder...");
	}
}

package com.array7.facotry_method;

public class ChinaHotelOrder extends Order{
	public ChinaHotelOrder() {
		System.out.println("create a ChinaHotelOrder...");
	}
}

package com.array7.facotry_method;

public class ChinaTicketOrder extends Order{
	public ChinaTicketOrder() {
		System.out.println("create a ChinaTicketOrder...");
	}
}

package com.array7.facotry_method;

public class ForeignAirOrder extends Order {
	@Override
	public void pay() {  // 覆盖了支付方式,使用visa以支持国际支付
		System.out.println("VISA paid...");
	}
}

package com.array7.facotry_method;

public class ForeignHotelOrder extends Order {
	public ForeignHotelOrder() {
		System.out.println("create a ForeignHotelOrder...");
	}
	
	@Override
	public void pay() {  // 覆盖了支付方式,使用visa以支持国际支付
		System.out.println("Visa paid...");
	}
}

package com.array7.facotry_method;

public class ForeignTicketOrder extends Order {
	public ForeignTicketOrder() {
		System.out.println("create a ForeignTicketOrder...");
	}
}


4、OK,至此我们的订单逻辑已经完成,下面下2张单测试一下:

package com.array7.facotry_method;

public class Test {
	public static void main(String[] args) {
		// 创建一个国内酒店订单
		OrderProcessCenter chinaOrderCenter = new ChinaOrderProcessCenter();
		chinaOrderCenter.orderFlow("hotel");
		// 创建一个国外订单
		OrderProcessCenter foreignderCenter = new ForeignOrderProcessCenter();
		foreignderCenter.orderFlow("hotel");
	}
}

输出:

create a ChinaHotelOrder...
paid...
done...
finished...
create a ForeignHotelOrder...
Visa paid...
done...
finished...

输出正常,是我们想要的结果。从此码农们可以专心搞一个模块了。业务也清晰了。每个业务线都能独立处理自己的逻辑。简单工厂模式的时候,我们是无法选择国内或者国外等类型的,而在订单中心中我们可以选择使用哪种工作生产产品。


文章仅供个人学习记录,有不到之处还请指正。


后续会慢慢润色力求精准全面。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值